From 0f23bdb275a64f22aa639497a044b79b65ef6332 Mon Sep 17 00:00:00 2001 From: Kim Kibum Date: Fri, 8 Jun 2012 14:53:54 +0900 Subject: [PATCH] apply FSL(Flora Software License) --- CMakeLists.txt | 25 + LICENSE | 75 + call-engine/core/include/vc-core-callagent.h | 242 + call-engine/core/include/vc-core-callmanager.h | 624 ++ call-engine/core/include/vc-core-ccbs.h | 58 + call-engine/core/include/vc-core-engine-group.h | 79 + call-engine/core/include/vc-core-engine-status.h | 232 + call-engine/core/include/vc-core-engine-types.h | 587 ++ call-engine/core/include/vc-core-engine.h | 380 + call-engine/core/include/vc-core-error.h | 88 + call-engine/core/include/vc-core-svcall.h | 50 + call-engine/core/include/vc-core-tapi-evnt.h | 171 + call-engine/core/include/vc-core-tapi-rqst.h | 186 + call-engine/core/include/vc-core-util.h | 300 + call-engine/core/vc-core-callagent.c | 591 ++ call-engine/core/vc-core-callmanager.c | 1913 +++++ call-engine/core/vc-core-ccbs.c | 111 + call-engine/core/vc-core-engine-group.c | 145 + call-engine/core/vc-core-engine-status.c | 755 ++ call-engine/core/vc-core-engine.c | 3221 ++++++++ call-engine/core/vc-core-svcall.c | 280 + call-engine/core/vc-core-tapi-evnt.c | 1498 ++++ call-engine/core/vc-core-tapi-rqst.c | 1169 +++ call-engine/core/vc-core-util.c | 1111 +++ call-engine/etc/rc.d/init.d/voice-calld | 7 + call-engine/etc/rc.d/rc3.d/S60voice-calld | 7 + call-engine/include/voice-call-bt.h | 201 + call-engine/include/voice-call-core.h | 628 ++ call-engine/include/voice-call-dbus.h | 37 + call-engine/include/voice-call-device.h | 77 + call-engine/include/voice-call-engine-msg.h | 430 ++ call-engine/include/voice-call-engine.h | 437 ++ call-engine/include/voice-call-service.h | 77 + call-engine/include/voice-call-sound.h | 387 + call-engine/sounds/01_Minimal_tone.mp3 | Bin 0 -> 34688 bytes call-engine/sounds/03_Call_connect.wav | Bin 0 -> 47944 bytes call-engine/sounds/04_Call_disconnect.wav | Bin 0 -> 17004 bytes call-engine/sounds/Call_BusyTone.wav | Bin 0 -> 160132 bytes call-engine/sounds/Call_ErrorTone.wav | Bin 0 -> 127492 bytes call-engine/sounds/Call_NwCongestionTone.wav | Bin 0 -> 153752 bytes call-engine/sounds/Call_RecordStart.wav | Bin 0 -> 22768 bytes call-engine/sounds/Call_WaitingTone.wav | Bin 0 -> 78244 bytes call-engine/voice-call-bt.c | 978 +++ call-engine/voice-call-core.c | 3678 +++++++++ call-engine/voice-call-dbus.c | 230 + call-engine/voice-call-device.c | 382 + call-engine/voice-call-engine.c | 872 +++ call-engine/voice-call-service.c | 244 + call-engine/voice-call-sound.c | 1775 +++++ debian/README | 6 + debian/changelog | 9 + debian/compat | 1 + debian/control | 42 + debian/copyright | 0 debian/dirs | 2 + debian/docs | 2 + debian/org.tizen.call.install.in | 4 + debian/org.tizen.call.postinst | 12 + debian/rules | 154 + packaging/org.tizen.call.spec | 66 + ui/CMakeLists.txt | 167 + ui/call_edc/vcui-view-dialing.edc | 129 + ui/call_edc/vcui-view-end-conf-call.edc | 163 + ui/call_edc/vcui-view-end-single-call.edc | 98 + ui/call_edc/vcui-view-incoming-lock.edc | 316 + ui/call_edc/vcui-view-incoming.edc | 177 + ui/call_edc/vcui-view-keypad.edc | 482 ++ ui/call_edc/vcui-view-multi-call-conf.edc | 169 + ui/call_edc/vcui-view-multi-call-list.edc | 109 + ui/call_edc/vcui-view-multi-call-split.edc | 728 ++ ui/call_edc/vcui-view-naviframe.edc | 30 + ui/call_edc/vcui-view-single-call.edc | 221 + ui/call_edc/vcui-view-ug-effect.edc | 98 + ui/call_edc/vcui-view-volume-popup.edc | 79 + ui/call_edc/voice-call-ui.edc | 59 + ui/default.conf | 3 + ui/images/PUT_IMAGES_HERE | 0 ui/images/hd/icon/vc_add_icon.png | Bin 0 -> 3104 bytes ui/images/hd/icon/vc_add_icon_dim.png | Bin 0 -> 3115 bytes ui/images/hd/icon/vc_btn_more.png | Bin 0 -> 4287 bytes ui/images/hd/icon/vc_calling_name_BG_image.png | Bin 0 -> 5625 bytes ui/images/hd/icon/vc_conference_private.png | Bin 0 -> 3662 bytes ui/images/hd/icon/vc_contact_icon.png | Bin 0 -> 3992 bytes ui/images/hd/icon/vc_contact_icon_dim.png | Bin 0 -> 3957 bytes ui/images/hd/icon/vc_icon_conf_call_end.png | Bin 0 -> 3737 bytes ui/images/hd/icon/vc_icon_conf_list_hold.png | Bin 0 -> 245 bytes ui/images/hd/icon/vc_icon_conf_list_unhold.png | Bin 0 -> 443 bytes ui/images/hd/icon/vc_icon_hold.png | Bin 0 -> 2937 bytes ui/images/hd/icon/vc_icon_hold_dim.png | Bin 0 -> 2939 bytes ui/images/hd/icon/vc_icon_pause.png | Bin 0 -> 3696 bytes ui/images/hd/icon/vc_icon_play.png | Bin 0 -> 3975 bytes ui/images/hd/icon/vc_icon_unhold.png | Bin 0 -> 3675 bytes ui/images/hd/icon/vc_icon_unhold_dim.png | Bin 0 -> 3655 bytes ui/images/hd/icon/vc_join_icon.png | Bin 0 -> 4348 bytes ui/images/hd/icon/vc_join_icon_dim.png | Bin 0 -> 4350 bytes ui/images/hd/icon/vc_keypad_icon.png | Bin 0 -> 5212 bytes ui/images/hd/icon/vc_keypad_icon_dim.png | Bin 0 -> 5121 bytes ui/images/hd/icon/vc_mute_icon.png | Bin 0 -> 3897 bytes ui/images/hd/icon/vc_mute_icon_dim.png | Bin 0 -> 3972 bytes ui/images/hd/icon/vc_normal_caller_ID.png | Bin 0 -> 47503 bytes ui/images/hd/icon/vc_normal_caller_ID_group.png | Bin 0 -> 68777 bytes ui/images/hd/icon/vc_qp_caller_ID.png | Bin 0 -> 2772 bytes ui/images/hd/icon/vc_qp_caller_ID_group.png | Bin 0 -> 3949 bytes ui/images/hd/icon/vc_rcs_share_icon.png | Bin 0 -> 3580 bytes ui/images/hd/icon/vc_rcs_share_icon_dim.png | Bin 0 -> 3648 bytes ui/images/hd/icon/vc_record_icon.png | Bin 0 -> 3538 bytes ui/images/hd/icon/vc_record_icon_dim.png | Bin 0 -> 3530 bytes ui/images/hd/icon/vc_record_stop_icon_crop.png | Bin 0 -> 3117 bytes .../icon/vc_reject_with_msg_header_icon_others.png | Bin 0 -> 2934 bytes ui/images/hd/icon/vc_speaker_icon.png | Bin 0 -> 4061 bytes ui/images/hd/icon/vc_speaker_icon_dim.png | Bin 0 -> 4067 bytes ui/images/hd/icon/vc_volume_icon.png | Bin 0 -> 4767 bytes ui/images/hd/icon/vc_volume_mute_icon.png | Bin 0 -> 3982 bytes ui/images/hd/keypad/vc_keypad_btn_icon-1.png | Bin 0 -> 3875 bytes ui/images/hd/keypad/vc_keypad_btn_icon.png | Bin 0 -> 3631 bytes ui/images/hd/keypad/vc_keypad_btn_normal-1.png | Bin 0 -> 3392 bytes ui/images/hd/keypad/vc_keypad_btn_normal.png | Bin 0 -> 3329 bytes ui/images/hd/keypad/vc_keypad_btn_press-1.png | Bin 0 -> 3270 bytes ui/images/hd/keypad/vc_keypad_btn_press.png | Bin 0 -> 3320 bytes ui/images/hd/vc_lock_accept_icon.png | Bin 0 -> 1276 bytes ui/images/hd/vc_lock_bottom_bg.png | Bin 0 -> 302 bytes ui/images/hd/vc_lock_left_bg.png | Bin 0 -> 2726 bytes ui/images/hd/vc_lock_reject_icon.png | Bin 0 -> 1906 bytes ui/images/hd/vc_lock_right_bg.png | Bin 0 -> 2208 bytes ui/images/wvga/icon/vc_add_icon.png | Bin 0 -> 3180 bytes ui/images/wvga/icon/vc_add_icon_dim.png | Bin 0 -> 3196 bytes ui/images/wvga/icon/vc_btn_more.png | Bin 0 -> 3635 bytes ui/images/wvga/icon/vc_conference_private-1.png | Bin 0 -> 3331 bytes ui/images/wvga/icon/vc_conference_private.png | Bin 0 -> 3662 bytes ui/images/wvga/icon/vc_contact_icon.png | Bin 0 -> 3518 bytes ui/images/wvga/icon/vc_contact_icon_dim.png | Bin 0 -> 3583 bytes ui/images/wvga/icon/vc_icon_conf_call_end-1.png | Bin 0 -> 3293 bytes ui/images/wvga/icon/vc_icon_conf_call_end.png | Bin 0 -> 3737 bytes ui/images/wvga/icon/vc_icon_hold.png | Bin 0 -> 245 bytes ui/images/wvga/icon/vc_icon_mute_press.png | Bin 0 -> 3553 bytes ui/images/wvga/icon/vc_icon_pause.png | Bin 0 -> 3153 bytes ui/images/wvga/icon/vc_icon_play.png | Bin 0 -> 3491 bytes ui/images/wvga/icon/vc_icon_sound_press.png | Bin 0 -> 4377 bytes ui/images/wvga/icon/vc_icon_unhold.png | Bin 0 -> 443 bytes ui/images/wvga/icon/vc_join_icon.png | Bin 0 -> 3541 bytes ui/images/wvga/icon/vc_join_icon_dim.png | Bin 0 -> 3718 bytes ui/images/wvga/icon/vc_keypad_icon.png | Bin 0 -> 3499 bytes ui/images/wvga/icon/vc_keypad_icon_dim.png | Bin 0 -> 3545 bytes ui/images/wvga/icon/vc_mute_icon.png | Bin 0 -> 3426 bytes ui/images/wvga/icon/vc_mute_icon_dim.png | Bin 0 -> 3538 bytes ui/images/wvga/icon/vc_normal_caller_ID.png | Bin 0 -> 10145 bytes ui/images/wvga/icon/vc_normal_caller_ID_group.png | Bin 0 -> 13123 bytes ui/images/wvga/icon/vc_qp_caller_ID.png | Bin 0 -> 2772 bytes ui/images/wvga/icon/vc_qp_caller_ID_group.png | Bin 0 -> 3949 bytes ui/images/wvga/icon/vc_rcs_share_icon.png | Bin 0 -> 3580 bytes ui/images/wvga/icon/vc_rcs_share_icon_dim.png | Bin 0 -> 3648 bytes ui/images/wvga/icon/vc_record_icon.png | Bin 0 -> 3246 bytes ui/images/wvga/icon/vc_record_icon_dim.png | Bin 0 -> 3228 bytes ui/images/wvga/icon/vc_record_stop_icon_crop.png | Bin 0 -> 3117 bytes .../icon/vc_reject_with_msg_header_icon_others.png | Bin 0 -> 2934 bytes ui/images/wvga/icon/vc_speaker_icon.png | Bin 0 -> 3774 bytes ui/images/wvga/icon/vc_speaker_icon_dim.png | Bin 0 -> 3892 bytes ui/images/wvga/icon/vc_volume_icon.png | Bin 0 -> 4767 bytes ui/images/wvga/icon/vc_volume_mute_icon.png | Bin 0 -> 3982 bytes ui/images/wvga/keypad/vc_keypad_btn_icon.png | Bin 0 -> 3875 bytes ui/images/wvga/keypad/vc_keypad_btn_normal.png | Bin 0 -> 3392 bytes ui/images/wvga/keypad/vc_keypad_btn_press.png | Bin 0 -> 3270 bytes ui/images/wvga/vc_lock_accept_icon.png | Bin 0 -> 1276 bytes ui/images/wvga/vc_lock_bottom_bg.png | Bin 0 -> 302 bytes ui/images/wvga/vc_lock_left_bg.png | Bin 0 -> 2726 bytes ui/images/wvga/vc_lock_reject_icon.png | Bin 0 -> 1906 bytes ui/images/wvga/vc_lock_right_bg.png | Bin 0 -> 2208 bytes ui/org.tizen.call.desktop.in | 10 + ui/po/CMakeLists.txt | 25 + ui/po/de_DE.po | 333 + ui/po/el_GR.po | 333 + ui/po/en.po | 333 + ui/po/es_ES.po | 333 + ui/po/fr_FR.po | 333 + ui/po/it_IT.po | 333 + ui/po/ja_JP.po | 333 + ui/po/ko_KR.po | 333 + ui/po/nl_NL.po | 333 + ui/po/pt_PT.po | 333 + ui/po/ru_RU.po | 333 + ui/po/tr_TR.po | 333 + ui/po/zh_CN.po | 333 + ui/po/zh_HK.po | 333 + ui/po/zh_TW.po | 333 + ui/themes/call_theme.edc | 8070 ++++++++++++++++++++ ui/themes/vc_btn_green.png | Bin 0 -> 3628 bytes ui/themes/vc_button_grey.png | Bin 0 -> 502 bytes ui/themes/vc_button_hide_keypad_normal.png | Bin 0 -> 3595 bytes ui/themes/vc_button_press.png | Bin 0 -> 3737 bytes ui/themes/vc_button_red_normal.png | Bin 0 -> 3643 bytes ui/themes/vc_button_rej_w_msg_normal.png | Bin 0 -> 3700 bytes ui/themes/vc_button_rej_w_msg_press.png | Bin 0 -> 3717 bytes ui/themes/vc_conf_call_list_bg.png | Bin 0 -> 2818 bytes ui/themes/vc_conference_call_btn_normal.png | Bin 0 -> 3079 bytes ui/themes/vc_conference_call_btn_press.png | Bin 0 -> 3093 bytes ui/themes/vc_conference_call_btn_red.png | Bin 0 -> 3077 bytes ui/themes/vc_control_btn_new_prev.png | Bin 0 -> 3259 bytes ui/themes/vc_control_btn_prev.png | Bin 0 -> 3235 bytes ui/themes/vc_reject_with_msg_back_icon.png | Bin 0 -> 313 bytes ui/themes/vc_reject_with_msg_control_top_arrow.png | Bin 0 -> 3048 bytes ui/themes/vc_reject_with_msg_control_top_bg.png | Bin 0 -> 2788 bytes .../vc_reject_with_msg_option_header_bt_press.png | Bin 0 -> 2813 bytes ui/themes/vc_second_mt_btn_normal.png | Bin 0 -> 3755 bytes ui/themes/vc_six_btn_layout_normal.png | Bin 0 -> 3329 bytes ui/themes/vc_six_btn_layout_press.png | Bin 0 -> 3320 bytes ui/vcui-app-data.h | 168 + ui/vcui-app-window.c | 323 + ui/vcui-app-window.h | 27 + ui/vcui-application.c | 1224 +++ ui/vcui-application.h | 318 + ui/vcui-doc-launch.c | 453 ++ ui/vcui-doc-launch.h | 58 + ui/vcui-document.c | 501 ++ ui/vcui-document.h | 87 + ui/vcui-engine-interface.c | 1113 +++ ui/vcui-engine-interface.h | 132 + ui/vcui-view-callend.c | 291 + ui/vcui-view-callend.h | 25 + ui/vcui-view-choice.c | 205 + ui/vcui-view-choice.h | 27 + ui/vcui-view-common.c | 420 + ui/vcui-view-common.h | 69 + ui/vcui-view-dialing.c | 368 + ui/vcui-view-dialing.h | 35 + ui/vcui-view-elements.c | 1158 +++ ui/vcui-view-elements.h | 56 + ui/vcui-view-incoming-lock.c | 421 + ui/vcui-view-incoming-lock.h | 39 + ui/vcui-view-incoming.c | 350 + ui/vcui-view-incoming.h | 34 + ui/vcui-view-keypad.c | 438 ++ ui/vcui-view-keypad.h | 46 + ui/vcui-view-layout-hd.h | 754 ++ ui/vcui-view-layout-wvga.h | 745 ++ ui/vcui-view-layout.h | 592 ++ ui/vcui-view-multi-call-conf.c | 241 + ui/vcui-view-multi-call-conf.h | 32 + ui/vcui-view-multi-call-list.c | 412 + ui/vcui-view-multi-call-list.h | 38 + ui/vcui-view-multi-call-split.c | 402 + ui/vcui-view-multi-call-split.h | 36 + ui/vcui-view-popup.c | 899 +++ ui/vcui-view-popup.h | 43 + ui/vcui-view-single-call.c | 316 + ui/vcui-view-single-call.h | 29 + 245 files changed, 53689 insertions(+) create mode 100755 CMakeLists.txt create mode 100755 LICENSE create mode 100755 call-engine/core/include/vc-core-callagent.h create mode 100755 call-engine/core/include/vc-core-callmanager.h create mode 100755 call-engine/core/include/vc-core-ccbs.h create mode 100755 call-engine/core/include/vc-core-engine-group.h create mode 100755 call-engine/core/include/vc-core-engine-status.h create mode 100755 call-engine/core/include/vc-core-engine-types.h create mode 100755 call-engine/core/include/vc-core-engine.h create mode 100755 call-engine/core/include/vc-core-error.h create mode 100755 call-engine/core/include/vc-core-svcall.h create mode 100755 call-engine/core/include/vc-core-tapi-evnt.h create mode 100755 call-engine/core/include/vc-core-tapi-rqst.h create mode 100755 call-engine/core/include/vc-core-util.h create mode 100755 call-engine/core/vc-core-callagent.c create mode 100755 call-engine/core/vc-core-callmanager.c create mode 100755 call-engine/core/vc-core-ccbs.c create mode 100755 call-engine/core/vc-core-engine-group.c create mode 100755 call-engine/core/vc-core-engine-status.c create mode 100755 call-engine/core/vc-core-engine.c create mode 100755 call-engine/core/vc-core-svcall.c create mode 100755 call-engine/core/vc-core-tapi-evnt.c create mode 100755 call-engine/core/vc-core-tapi-rqst.c create mode 100755 call-engine/core/vc-core-util.c create mode 100755 call-engine/etc/rc.d/init.d/voice-calld create mode 100755 call-engine/etc/rc.d/rc3.d/S60voice-calld create mode 100755 call-engine/include/voice-call-bt.h create mode 100755 call-engine/include/voice-call-core.h create mode 100755 call-engine/include/voice-call-dbus.h create mode 100755 call-engine/include/voice-call-device.h create mode 100755 call-engine/include/voice-call-engine-msg.h create mode 100755 call-engine/include/voice-call-engine.h create mode 100755 call-engine/include/voice-call-service.h create mode 100755 call-engine/include/voice-call-sound.h create mode 100755 call-engine/sounds/01_Minimal_tone.mp3 create mode 100755 call-engine/sounds/03_Call_connect.wav create mode 100755 call-engine/sounds/04_Call_disconnect.wav create mode 100755 call-engine/sounds/Call_BusyTone.wav create mode 100755 call-engine/sounds/Call_ErrorTone.wav create mode 100755 call-engine/sounds/Call_NwCongestionTone.wav create mode 100755 call-engine/sounds/Call_RecordStart.wav create mode 100755 call-engine/sounds/Call_WaitingTone.wav create mode 100755 call-engine/voice-call-bt.c create mode 100755 call-engine/voice-call-core.c create mode 100755 call-engine/voice-call-dbus.c create mode 100755 call-engine/voice-call-device.c create mode 100755 call-engine/voice-call-engine.c create mode 100755 call-engine/voice-call-service.c create mode 100755 call-engine/voice-call-sound.c create mode 100755 debian/README create mode 100755 debian/changelog create mode 100755 debian/compat create mode 100755 debian/control create mode 100755 debian/copyright create mode 100755 debian/dirs create mode 100755 debian/docs create mode 100755 debian/org.tizen.call.install.in create mode 100755 debian/org.tizen.call.postinst create mode 100755 debian/rules create mode 100644 packaging/org.tizen.call.spec create mode 100755 ui/CMakeLists.txt create mode 100755 ui/call_edc/vcui-view-dialing.edc create mode 100755 ui/call_edc/vcui-view-end-conf-call.edc create mode 100755 ui/call_edc/vcui-view-end-single-call.edc create mode 100755 ui/call_edc/vcui-view-incoming-lock.edc create mode 100755 ui/call_edc/vcui-view-incoming.edc create mode 100755 ui/call_edc/vcui-view-keypad.edc create mode 100755 ui/call_edc/vcui-view-multi-call-conf.edc create mode 100755 ui/call_edc/vcui-view-multi-call-list.edc create mode 100755 ui/call_edc/vcui-view-multi-call-split.edc create mode 100755 ui/call_edc/vcui-view-naviframe.edc create mode 100755 ui/call_edc/vcui-view-single-call.edc create mode 100755 ui/call_edc/vcui-view-ug-effect.edc create mode 100755 ui/call_edc/vcui-view-volume-popup.edc create mode 100755 ui/call_edc/voice-call-ui.edc create mode 100755 ui/default.conf create mode 100755 ui/images/PUT_IMAGES_HERE create mode 100644 ui/images/hd/icon/vc_add_icon.png create mode 100644 ui/images/hd/icon/vc_add_icon_dim.png create mode 100644 ui/images/hd/icon/vc_btn_more.png create mode 100644 ui/images/hd/icon/vc_calling_name_BG_image.png create mode 100644 ui/images/hd/icon/vc_conference_private.png create mode 100644 ui/images/hd/icon/vc_contact_icon.png create mode 100644 ui/images/hd/icon/vc_contact_icon_dim.png create mode 100644 ui/images/hd/icon/vc_icon_conf_call_end.png create mode 100755 ui/images/hd/icon/vc_icon_conf_list_hold.png create mode 100755 ui/images/hd/icon/vc_icon_conf_list_unhold.png create mode 100755 ui/images/hd/icon/vc_icon_hold.png create mode 100755 ui/images/hd/icon/vc_icon_hold_dim.png create mode 100644 ui/images/hd/icon/vc_icon_pause.png create mode 100644 ui/images/hd/icon/vc_icon_play.png create mode 100755 ui/images/hd/icon/vc_icon_unhold.png create mode 100755 ui/images/hd/icon/vc_icon_unhold_dim.png create mode 100644 ui/images/hd/icon/vc_join_icon.png create mode 100644 ui/images/hd/icon/vc_join_icon_dim.png create mode 100644 ui/images/hd/icon/vc_keypad_icon.png create mode 100644 ui/images/hd/icon/vc_keypad_icon_dim.png create mode 100644 ui/images/hd/icon/vc_mute_icon.png create mode 100644 ui/images/hd/icon/vc_mute_icon_dim.png create mode 100755 ui/images/hd/icon/vc_normal_caller_ID.png create mode 100755 ui/images/hd/icon/vc_normal_caller_ID_group.png create mode 100644 ui/images/hd/icon/vc_qp_caller_ID.png create mode 100644 ui/images/hd/icon/vc_qp_caller_ID_group.png create mode 100644 ui/images/hd/icon/vc_rcs_share_icon.png create mode 100644 ui/images/hd/icon/vc_rcs_share_icon_dim.png create mode 100644 ui/images/hd/icon/vc_record_icon.png create mode 100644 ui/images/hd/icon/vc_record_icon_dim.png create mode 100644 ui/images/hd/icon/vc_record_stop_icon_crop.png create mode 100644 ui/images/hd/icon/vc_reject_with_msg_header_icon_others.png create mode 100644 ui/images/hd/icon/vc_speaker_icon.png create mode 100644 ui/images/hd/icon/vc_speaker_icon_dim.png create mode 100644 ui/images/hd/icon/vc_volume_icon.png create mode 100644 ui/images/hd/icon/vc_volume_mute_icon.png create mode 100644 ui/images/hd/keypad/vc_keypad_btn_icon-1.png create mode 100644 ui/images/hd/keypad/vc_keypad_btn_icon.png create mode 100644 ui/images/hd/keypad/vc_keypad_btn_normal-1.png create mode 100644 ui/images/hd/keypad/vc_keypad_btn_normal.png create mode 100644 ui/images/hd/keypad/vc_keypad_btn_press-1.png create mode 100644 ui/images/hd/keypad/vc_keypad_btn_press.png create mode 100644 ui/images/hd/vc_lock_accept_icon.png create mode 100644 ui/images/hd/vc_lock_bottom_bg.png create mode 100644 ui/images/hd/vc_lock_left_bg.png create mode 100644 ui/images/hd/vc_lock_reject_icon.png create mode 100644 ui/images/hd/vc_lock_right_bg.png create mode 100644 ui/images/wvga/icon/vc_add_icon.png create mode 100644 ui/images/wvga/icon/vc_add_icon_dim.png create mode 100644 ui/images/wvga/icon/vc_btn_more.png create mode 100644 ui/images/wvga/icon/vc_conference_private-1.png create mode 100644 ui/images/wvga/icon/vc_conference_private.png create mode 100644 ui/images/wvga/icon/vc_contact_icon.png create mode 100644 ui/images/wvga/icon/vc_contact_icon_dim.png create mode 100644 ui/images/wvga/icon/vc_icon_conf_call_end-1.png create mode 100644 ui/images/wvga/icon/vc_icon_conf_call_end.png create mode 100644 ui/images/wvga/icon/vc_icon_hold.png create mode 100644 ui/images/wvga/icon/vc_icon_mute_press.png create mode 100644 ui/images/wvga/icon/vc_icon_pause.png create mode 100644 ui/images/wvga/icon/vc_icon_play.png create mode 100644 ui/images/wvga/icon/vc_icon_sound_press.png create mode 100644 ui/images/wvga/icon/vc_icon_unhold.png create mode 100644 ui/images/wvga/icon/vc_join_icon.png create mode 100644 ui/images/wvga/icon/vc_join_icon_dim.png create mode 100644 ui/images/wvga/icon/vc_keypad_icon.png create mode 100644 ui/images/wvga/icon/vc_keypad_icon_dim.png create mode 100644 ui/images/wvga/icon/vc_mute_icon.png create mode 100644 ui/images/wvga/icon/vc_mute_icon_dim.png create mode 100644 ui/images/wvga/icon/vc_normal_caller_ID.png create mode 100644 ui/images/wvga/icon/vc_normal_caller_ID_group.png create mode 100644 ui/images/wvga/icon/vc_qp_caller_ID.png create mode 100644 ui/images/wvga/icon/vc_qp_caller_ID_group.png create mode 100644 ui/images/wvga/icon/vc_rcs_share_icon.png create mode 100644 ui/images/wvga/icon/vc_rcs_share_icon_dim.png create mode 100644 ui/images/wvga/icon/vc_record_icon.png create mode 100644 ui/images/wvga/icon/vc_record_icon_dim.png create mode 100644 ui/images/wvga/icon/vc_record_stop_icon_crop.png create mode 100644 ui/images/wvga/icon/vc_reject_with_msg_header_icon_others.png create mode 100644 ui/images/wvga/icon/vc_speaker_icon.png create mode 100644 ui/images/wvga/icon/vc_speaker_icon_dim.png create mode 100644 ui/images/wvga/icon/vc_volume_icon.png create mode 100644 ui/images/wvga/icon/vc_volume_mute_icon.png create mode 100644 ui/images/wvga/keypad/vc_keypad_btn_icon.png create mode 100644 ui/images/wvga/keypad/vc_keypad_btn_normal.png create mode 100644 ui/images/wvga/keypad/vc_keypad_btn_press.png create mode 100644 ui/images/wvga/vc_lock_accept_icon.png create mode 100644 ui/images/wvga/vc_lock_bottom_bg.png create mode 100644 ui/images/wvga/vc_lock_left_bg.png create mode 100644 ui/images/wvga/vc_lock_reject_icon.png create mode 100644 ui/images/wvga/vc_lock_right_bg.png create mode 100755 ui/org.tizen.call.desktop.in create mode 100755 ui/po/CMakeLists.txt create mode 100755 ui/po/de_DE.po create mode 100755 ui/po/el_GR.po create mode 100755 ui/po/en.po create mode 100755 ui/po/es_ES.po create mode 100755 ui/po/fr_FR.po create mode 100755 ui/po/it_IT.po create mode 100755 ui/po/ja_JP.po create mode 100755 ui/po/ko_KR.po create mode 100755 ui/po/nl_NL.po create mode 100755 ui/po/pt_PT.po create mode 100755 ui/po/ru_RU.po create mode 100755 ui/po/tr_TR.po create mode 100755 ui/po/zh_CN.po create mode 100755 ui/po/zh_HK.po create mode 100755 ui/po/zh_TW.po create mode 100755 ui/themes/call_theme.edc create mode 100644 ui/themes/vc_btn_green.png create mode 100644 ui/themes/vc_button_grey.png create mode 100644 ui/themes/vc_button_hide_keypad_normal.png create mode 100644 ui/themes/vc_button_press.png create mode 100644 ui/themes/vc_button_red_normal.png create mode 100644 ui/themes/vc_button_rej_w_msg_normal.png create mode 100644 ui/themes/vc_button_rej_w_msg_press.png create mode 100644 ui/themes/vc_conf_call_list_bg.png create mode 100644 ui/themes/vc_conference_call_btn_normal.png create mode 100644 ui/themes/vc_conference_call_btn_press.png create mode 100644 ui/themes/vc_conference_call_btn_red.png create mode 100644 ui/themes/vc_control_btn_new_prev.png create mode 100644 ui/themes/vc_control_btn_prev.png create mode 100755 ui/themes/vc_reject_with_msg_back_icon.png create mode 100755 ui/themes/vc_reject_with_msg_control_top_arrow.png create mode 100755 ui/themes/vc_reject_with_msg_control_top_bg.png create mode 100755 ui/themes/vc_reject_with_msg_option_header_bt_press.png create mode 100644 ui/themes/vc_second_mt_btn_normal.png create mode 100644 ui/themes/vc_six_btn_layout_normal.png create mode 100644 ui/themes/vc_six_btn_layout_press.png create mode 100755 ui/vcui-app-data.h create mode 100755 ui/vcui-app-window.c create mode 100755 ui/vcui-app-window.h create mode 100755 ui/vcui-application.c create mode 100755 ui/vcui-application.h create mode 100755 ui/vcui-doc-launch.c create mode 100755 ui/vcui-doc-launch.h create mode 100755 ui/vcui-document.c create mode 100755 ui/vcui-document.h create mode 100755 ui/vcui-engine-interface.c create mode 100755 ui/vcui-engine-interface.h create mode 100755 ui/vcui-view-callend.c create mode 100755 ui/vcui-view-callend.h create mode 100755 ui/vcui-view-choice.c create mode 100755 ui/vcui-view-choice.h create mode 100755 ui/vcui-view-common.c create mode 100755 ui/vcui-view-common.h create mode 100755 ui/vcui-view-dialing.c create mode 100755 ui/vcui-view-dialing.h create mode 100755 ui/vcui-view-elements.c create mode 100755 ui/vcui-view-elements.h create mode 100755 ui/vcui-view-incoming-lock.c create mode 100755 ui/vcui-view-incoming-lock.h create mode 100755 ui/vcui-view-incoming.c create mode 100755 ui/vcui-view-incoming.h create mode 100755 ui/vcui-view-keypad.c create mode 100755 ui/vcui-view-keypad.h create mode 100755 ui/vcui-view-layout-hd.h create mode 100755 ui/vcui-view-layout-wvga.h create mode 100755 ui/vcui-view-layout.h create mode 100755 ui/vcui-view-multi-call-conf.c create mode 100755 ui/vcui-view-multi-call-conf.h create mode 100755 ui/vcui-view-multi-call-list.c create mode 100755 ui/vcui-view-multi-call-list.h create mode 100755 ui/vcui-view-multi-call-split.c create mode 100755 ui/vcui-view-multi-call-split.h create mode 100755 ui/vcui-view-popup.c create mode 100755 ui/vcui-view-popup.h create mode 100755 ui/vcui-view-single-call.c create mode 100755 ui/vcui-view-single-call.h diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 0000000..d8f4976 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,25 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(voice-call-ui C) + +# Architecture +FIND_PROGRAM(UNAME NAMES uname) +EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") +IF("${ARCH}" STREQUAL "arm") + ADD_DEFINITIONS("-D_CALL_ARCH_ARM_") +ENDIF() + +#INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + +#ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"") +#ADD_DEFINITIONS("-DFACTORYFS=\"$ENV{PREFIX}\"") +#ADD_DEFINITIONS("-DDATAFS=\"$ENV{DATADIR}\"") +#ADD_DEFINITIONS(${SHARED_FLAGS}) + + +ADD_DEFINITIONS("-DCALL_DEBUG_ON_DLOG") +#ADD_DEFINITIONS("-DCALL_DEBUG_ON_SCREEN") + +SET(COMMON_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") + +ADD_SUBDIRECTORY(ui) + diff --git a/LICENSE b/LICENSE new file mode 100755 index 0000000..7ccb5b5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,75 @@ +Flora License + +Version 1.0, May, 2012 + +http://www.tizenopensource.org/license + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +"Tizen Certified Platform" shall mean a software platform that complies with the standards set forth in the Compatibility Definition Document and passes the Compatibility Test Suite as defined from time to time by the Tizen Technical Steering Group and certified by the Tizen Association or its designated agent. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work solely as incorporated into a Tizen Certified Platform, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work solely as incorporated into a Tizen Certified Platform to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof pursuant to the copyright license above, in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + 1. You must give any other recipients of the Work or Derivative Works a copy of this License; and + + 2. You must cause any modified files to carry prominent notices stating that You changed the files; and + + 3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + 4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Flora License to your work + +To apply the Flora License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Flora License, Version 1.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.tizenopensource.org/license + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/call-engine/core/include/vc-core-callagent.h b/call-engine/core/include/vc-core-callagent.h new file mode 100755 index 0000000..78fc48b --- /dev/null +++ b/call-engine/core/include/vc-core-callagent.h @@ -0,0 +1,242 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VC_CORE_CALL_AGENT_H_ +#define __VC_CORE_CALL_AGENT_H_ + +#include +#include "vc-core-callmanager.h" +#ifdef _CPHS_DEFINED_ +#include "status-interface.h" +#endif + +/**< Maximum Telephony Event */ +#define CALL_VC_TAPI_CALL_EVENT_MAX_NUM 33 +#define CALL_VC_SIMATK_EVENT_MAX_NUM 3 /**< Maximum SIM ATK Event */ +#define CALL_VC_TAPI_READY_EVENT_NUM 1 /**< Tapi Service Ready Event */ +#define CALL_VC_TAPI_SUBSCRIPTION_MAX (CALL_VC_TAPI_CALL_EVENT_MAX_NUM+CALL_VC_TAPI_READY_EVENT_NUM+CALL_VC_SIMATK_EVENT_MAX_NUM) + +/** + * This enumeration provides CA STATEs + */ +typedef enum { + CALL_VC_CA_STATE_NORMAL, /**< Normal state */ + CALL_VC_CA_STATE_SPLIT_CALLBOX, /**< Call split state */ + CALL_VC_CA_STATE_WAIT_SPLIT, /**< Waiting for call split state */ + CALL_VC_CA_STATE_DROP_CALLBOX, /**< Call drop state */ + CALL_VC_CA_STATE_WAIT_DROP, /**< Waiting for drop state */ +#ifdef SWAP_SUPPORT + CALL_VC_CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE, /**< Wait for swapping activce/hold call state */ + CALL_VC_CA_STATE_WAIT_SWAP_HOLD, /**< Wait for swapping held call state */ + CALL_VC_CA_STATE_WAIT_SWAP_ACTIVE, /**< Wait for swapping active call state */ +#endif + CALL_VC_CA_STATE_WAIT_SWAP, /**< Wait for swap state */ + CALL_VC_CA_STATE_WAIT_HOLD, /**< Wait for hold state */ + CALL_VC_CA_STATE_WAIT_UNHOLD, /**< Wait for unhold state */ + CALL_VC_CA_STATE_WAIT_JOIN, /**< Wait for join state */ + CALL_VC_CA_STATE_WAIT_TRANSFER_CNF, /**< Wait for transfer confirmation state */ + CALL_VC_CA_STATE_WAIT_TRANSFER_CALLEND, /**< Wait for transfer callend state */ + CALL_VC_CA_STATE_WAIT_RELEASE_ALL_ACTIVECALL, /**< Wait for release all active call state */ + CALL_VC_CA_STATE_WAIT_RELEASE_ALL_HOLDCALL, /**< Wait for release all held call state */ + CALL_VC_CA_STATE_SENDMSG_CALLBOX, /**< Message send callbox active state */ + CALL_VC_CA_STATE_VIEW_CONTACT_DETAIL_CALLBOX, /**< Contact detail view state */ + CALL_VC_CA_STATE_SAVE_TO_CONTACT_CALLBOX, /**< Save to contact state */ + CALL_VC_CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL, /**< Wait for release all active calls */ + CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS, /**< Wait for release all calls */ + CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SETUP, /**< Wait for release all calls to setup */ + CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SWITCH_TO_VIDEO_CALL,/**< Wait for release all calls to setup videocall */ + CALL_VC_CA_STATE_MAX_NUM /**< Max value for the state */ +} call_vc_ca_state_t; + +/** + * This structure defines voicecall agent data + */ +typedef struct _voicecall_engine_t { + call_vc_ca_state_t callagent_state; /**< Call Agent State */ + voicecall_inout_state_t io_state; /**< Voicecall Engine IO State */ + call_vc_manager_t call_manager; /**< Handle for the Call Manager */ + TelSimCardType_t card_type; /**< SIM Card Type */ + + gboolean bdtmf_ring; /**< dtmf ring? */ + + gboolean bonly_sos_call; /**< only SOS calls possible , if TRUE */ + gboolean bis_no_sim; /**< SIM not available , if TRUE */ + gboolean bdownload_call; /**< Automated call test after binary download , if TRUE */ + + /*No structure in TAPI 14Mar08 */ + /*tapi_call_ccbs_info_t ccbs_info[CALL_VC_CCBS_NUMBER_MAX]; < call control for busy subscriber info */ + int ccbs_index; /**< Index for ccbs_info*/ + + /*AOC*/ + float aoc_ppm; /**< Price per unit value of currency meter */ + + /*CPHS Info*/ +#ifdef _CPHS_DEFINED_ + status_class_cphs_type cphs_status; /**< stores the cphs status information*/ + gboolean bcphs_read_success; /**< Flag for CPHS read status*/ +#endif + + /*Subscription Information */ + unsigned int subscription_id[CALL_VC_TAPI_SUBSCRIPTION_MAX]; + int curr_tapi_path; + + /*Client Information */ + voicecall_cb client_callback; /** +#include + +/**< This is the prototype of the client callback function */ +typedef gboolean(*voicecall_cb) (int event, int param1, int param2, void *param3, void *puser_data); + +/** + * This opaque structure is the interface for the client application to communicate to the engine + */ +typedef struct _voicecall_engine_t voicecall_engine_t; + +/**< General Macro Definitions */ +#define TAG_CALL "CALL" +#define TAG_CALL_LAUNCH "VCKPI" +#define VC_DISPLAY_NAME_LENGTH_MAX (255+1) /**< Voiecall Display Name Max Length */ +#define VC_IMAGE_PATH_LENGTH_MAX (255+1) /**< Max File length for image */ +#define VC_RINGTONE_PATH_LENGTH_MAX (255+1) /**< Max File length for Ringtone */ +#define VC_DATA_LENGTH_MAX (255+1) /**< Max data length for misc */ +#define VC_PHONE_NUMBER_LENGTH_MAX (82+1) /**< Maximum length of a phone number */ +#define VC_PHONE_NAME_LENGTH_MAX (80+1) /**< Maximum length of a calling name */ +#define VC_PHONE_SUBADDRESS_LENGTH_MAX (40+1) /**< Maximum length of a SUB address */ +#define VC_MAX_CALL_GROUP_MEMBER 5 /**< Maximum number of members in a group */ +#define VC_MAX_CALL_MEMBER 8 /**< This is the maximum number of members possible */ +#define VC_INVALID_CALL_ID 0 /**< This is the invalid entry for call ID */ +#define VC_MAX_CALL_ID 7 /**< Maximum Allowed Call IDS (1 -7) (5 Conf Calls, 1 Other Connected Call and 1 Outgoing/Incoming Call)*/ + +#define VC_AOC_CURRENCY_CODE_LEN_MAX 3 /**< Max Length of the AOC Currency Code */ + +#define VC_INVALID_CALL_INDEX -1 +#define VC_INVALID_CALL_COST -1 +#define VC_INVALID_PPM -1 + +#define VC_TAPI_INVALID_CALLHANDLE -1 +#define VC_RQSTID_DEFAULT -1 /**< To collect request ID of Async TAPI request*/ + +#define VC_ED_HANDLE 0 +#define VC_SAT_ICON_SIZE (64*64) + +#define VC_EMERGENCY_NUM_MAX 8 + +#define VC_RECORD_FULL_FILE_PATH_LENGTH (4095+1) +#ifndef VC_NO_ERROR +#define VC_NO_ERROR 0 +#endif + +#ifndef VC_ERROR +#define VC_ERROR -1 +#endif + +#ifndef VC_INVALID_VOLUME +#define VC_INVALID_VOLUME -1 +#endif +/**< General Macro Definitions */ + +#ifndef EXPORT_API +#define EXPORT_API __attribute__((visibility("default"))) +#endif + +/** + * This enumeration defines the call states + */ +typedef enum { + VC_CALL_ACCEPT_1, + VC_CALL_ACCEPT_2 +} voicecall_accept_choice_t; + +/** + * This enumeration defines the call states + */ +typedef enum { + VC_CALL_STATE_NONE, /**< No call state */ + VC_CALL_STATE_INCOME, /**< Incoming state */ + VC_CALL_STATE_REJECTED, /**< Rejected state */ + VC_CALL_STATE_PREPARE_OUTGOING, /**< Prepare for outgoing */ + VC_CALL_STATE_OUTGOING, /**< Outgoing state */ + VC_CALL_STATE_OUTGOING_ORIG, /**< Outgoing originatged state */ + VC_CALL_STATE_OUTGOING_ALERT, /**< Outgoing alert state */ + VC_CALL_STATE_CANCELLED, /**< Cancelled state */ + VC_CALL_STATE_CONNECTED, /**< Connected state */ + VC_CALL_STATE_RELEASE_WAIT, /**< Release wait state */ + VC_CALL_STATE_ENDED, /**< Call ended state */ + VC_CALL_STATE_REDIAL, /**< Redial state */ + VC_CALL_STATE_ENDED_FINISH, /**< Call ended finish state */ + VC_CALL_STATE_MAX_NUM /**< Max value */ +} voicecall_call_state_t; + +/** + * This enumeration defines the call setup parties + */ +typedef enum { + VC_CALL_SETUP_BY_NORMAL, /**< Normal Call setup */ + VC_CALL_SETUP_BY_SAT, /**< Call setup by SAT */ + VC_CALL_SETUP_BY_MAILBOX /**< Call setup by Mail box */ +} voicecall_call_type_bysetup_t; + +/** + * This enumeration defines the call end cause types + */ +typedef enum { + VC_ENDCAUSE_CALL_ENDED, /**< Call ended */ + + VC_ENDCAUSE_CALL_DISCONNECTED, /**< Call disconnected */ + VC_ENDCAUSE_CALL_SERVICE_NOT_ALLOWED, /**< Service not allowed */ + VC_ENDCAUSE_CALL_BARRED, /**< Call barred */ + VC_ENDCAUSE_NO_SERVICE, /**< No Service */ + VC_ENDCAUSE_NW_BUSY, /**< Network busy */ + + VC_ENDCAUSE_NW_FAILED, /**< Network failed */ + VC_ENDCAUSE_NO_ANSWER, /**< No anwer from other party */ + VC_ENDCAUSE_NO_CREDIT, /**< No credit available */ + VC_ENDCAUSE_REJECTED, /**< Call rejected */ + VC_ENDCAUSE_USER_BUSY, /**< user busy */ + + VC_ENDCAUSE_WRONG_GROUP, /**< Wrong group */ + VC_ENDCAUSE_CALL_NOT_ALLOWED, /**< Call not allowed */ + VC_ENDCAUSE_TAPI_ERROR, /**< Tapi error */ + VC_ENDCAUSE_CALL_FAILED, /**< Call Failed */ + VC_ENDCAUSE_NO_USER_RESPONDING, /**< User not responding */ + + VC_ENDCAUSE_USER_ALERTING_NO_ANSWER, /**< User Alerting No Answer */ + VC_ENDCAUSE_SERVICE_TEMP_UNAVAILABLE, /**< Circuit Channel Unavailable,Network is out of Order,Switching equipment congestion,Temporary Failure */ + VC_ENDCAUSE_USER_UNAVAILABLE, /**< Called Party Rejects the Call */ + VC_ENDCAUSE_INVALID_NUMBER_FORMAT, /**< Entered number is invalid or incomplete */ + VC_ENDCAUSE_NUMBER_CHANGED, /**< Entered number has been changed */ + + VC_ENDCAUSE_UNASSIGNED_NUMBER, /**< Unassigned/Unallocated number*/ + VC_ENDCAUSE_USER_DOESNOT_RESPOND, /**< Called Party does not respond*/ + VC_ENDCAUSE_IMEI_REJECTED, /**< Called Party does not respond*/ + /*VC_ENDCAUSE_SWITCHING_EQUIPMENT_CONGESTION, /**< Switching Equipment Congestion : 20090627 match as NW_BUSY*/ +} voice_call_end_cause_type_t; + +/** +* This enumeration defines the call types used to end the calls in end call API +*/ +typedef enum { + VC_END_OUTGOING_CALL, /**< To end only mobile originated outgoing call*/ + VC_END_INCOMING_CALL, /**< To end only mobile terminated incoming call*/ + VC_END_ACTIVE_OR_HELD_CALLS, /**< To end first active call if available or to end end held call*/ + VC_END_ALL_ACTIVE_CALLS, /**< To end all available active calls*/ + VC_END_ALL_HELD_CALLS, /**< To end all available held calls*/ + VC_END_ALL_CALLS /**< To end all available calls(active,held,incoming/outgoing*/ +} _vc_core_engine_end_call_type_t; + +/** +* This enumeration defines flags to be used with _vc_core_engine_status_set_end_flag +*/ +typedef enum { + VC_RETREIVE_CALL_ON_MOCALL_END /**< To be used before ending the mo call to retrieve the held call on mo call end if held call is available*/ +} voicecall_end_flag_t; + +/** + * This enum defines the different call types by source of origination of call + */ +typedef enum { + VC_CALL_ORIG_TYPE_NORMAL, /**< Normal Call */ + VC_CALL_ORIG_TYPE_EMERGENCY, /**< Emergency Call*/ + VC_CALL_ORIG_TYPE_VOICEMAIL, /**< Voiece Mail Call*/ + VC_CALL_ORIG_TYPE_SAT, /**< SAT Requested Call*/ + VC_CALL_ORIG_TYPE_NOSIM, /**< Emergency Call with out SIM*/ + VC_CALL_ORIG_TYPE_PINLOCK /**< Emergency Call with Pin Lock*/ +} voicecall_call_orig_type_t; + +/** + * This enum defines the different call types to be used with the assiociated APIs + */ +typedef enum { + VC_INCOMING_CALL, /**< Mobile Terminated Call*/ + VC_OUTGOING_CALL, /**< Mobile Originated Call*/ + VC_CONNECTED_CALL /**< Connected Call (Both Parties Connected)*/ +} voicecall_call_type_t; + +/** +* This enum defines the type of calls being termed once the calls are connected +*/ +typedef enum { + VC_ACTIVE_CALL, /**< Connected calls in active state*/ + VC_HELD_CALL /**< Connected calls in held state*/ +} voicecall_connected_call_type_t; + +/** + * This enum defines alternate line service types + */ +typedef enum { + VC_CALL_CPHS_ALS_NONE, /**< No ALS */ + VC_CALL_CPHS_ALS_LINE1, /**< Line 1*/ + VC_CALL_CPHS_ALS_LINE2 /**< Line 2 */ +} voice_call_cphs_alsline_t; + +/** + * This enum defines the call group states + */ +typedef enum { + CALL_VC_GROUP_STATE_NONE, /**< Group State Not Exist */ + CALL_VC_GROUP_STATE_ACTIVE, /**< Active group state */ + CALL_VC_GROUP_STATE_HOLD /**< Hold group state */ +} call_vc_groupstate_t; + +/** + * This enum defines the mobile originated call states + */ +typedef enum { + VC_MOCALL_STATE_NONE, /**< MO State Not Exist */ + VC_MOCALL_STATE_END, /**< MO State End */ + VC_MOCALL_STATE_CANCEL, /**< MO State Cancel */ + VC_MOCALL_STATE_DESTROY /**< MO State Destroy */ +} voice_call_mocall_state_t; + +#ifdef _CALL_LONG_DTMF +/** + * This enum defines dtmf buffer states + */ +typedef enum { + CALL_VC_DTMF_BUF_NONE, /**< Buffer state Not Exist */ + CALL_VC_DTMF_BUF_START, /**< Buffer start */ + CALL_VC_DTMF_BUF_RECEIVED_START_ACK, /**< Reveived start acknowledgement */ + CALL_VC_DTMF_BUF_WAIT_STOP_ACK /**< Wait stop acknowledgement */ +} call_vc_dtmf_bufferstate_t; +#endif + +/** +* This enum defines vc engine sat mo call ctrl response type +*/ +typedef enum __voicecall_engine_sat_mo_call_ctrl_res { + CALL_ALLOWED_NO_MOD, /**< Call Allowed without any modification in the caller details */ + CALL_NOT_ALLOWED, /**< Call Not Allowed - (User should be notified) */ + CALL_ALLOWED_WITH_MOD, /**< Call Allowed with modification in the caller details- (UI should be updated) */ + CALL_CHANGED_TO_SS /**< Call number modified to SS String */ +} voicecall_engine_sat_mo_call_ctrl_res; + +/** + * This enum defines sat request response types + */ +typedef enum __voicecall_engine_sat_rqst_resp_type { + SAT_RQST_SETUP_CALL, /**< Sat setup call request */ + SAT_RQST_SEND_DTMF, /**< Sat send dtmf request */ + SAT_RESP_SETUP_CALL /**< Sat setup call response */ +} voicecall_engine_sat_rqst_resp_type; + +/** + * This enum defines voicecall engine callback event types + */ +typedef enum _voicecall_engine_event_t { + /* Tapi Call Related Event Types */ + VC_CALL_INCOM, /**< Incoming call */ + VC_CALL_OUTGOING, /**< Outgoing call. This event will be sent, when outgoing deferred and made after some time */ + VC_CALL_OUTGOING_ORIG, /**< Outgoing call originated */ + VC_CALL_OUTGOING_ALERT, /**< Outgoing alert call */ + VC_CALL_CONNECTED, /**< Call connected */ + VC_CALL_NORMAL_END, /**< Normal end */ + VC_CALL_INCOM_END, /**< Incoming call end */ + VC_CALL_INCOM_DROPPED, /**< Incoming call ended before it is being precessed by the engine */ + VC_CALL_REJECTED_END, /**< Rejected call end */ + VC_CALL_OUTGOING_END, /**< Outgoing call end */ + VC_CALL_OUTGOING_ABORTED, /**< Outgoing call ended before making the call to the NW */ + VC_CALL_DTMF_ACK, /**< DTMF Acknowledgement */ + VC_CALL_AUTO_REDIAL_CHECK, /**< Auto Redial Check */ + VC_CALL_ANSWER_CNF, /**< Answer confirm */ + + /*Tapi Call Dependent SS related events */ + VC_CALL_SS_HELD, /**< SS Held */ + VC_CALL_SS_RETREIVED, /**< SS Retriebved */ + VC_CALL_SS_SWAP, /**< SS call swap */ + VC_CALL_SS_SETUP_CONF, /**< SS setup conference */ + VC_CALL_SS_SPLIT_CONF, /**< SS Split conference */ + VC_CALL_SS_TRANSFERRED, /**< SS call transferred */ + VC_CALL_SS_CONNECT_LINE_IND, /**< SS connectect line indication */ + + /*Tapi Call SS Indication Related Events */ + VC_CALL_IND_FORWARD, /**< Call forward */ + VC_CALL_IND_ACTIVATE, /**< Activate call */ + VC_CALL_IND_HOLD, /**< Hold call */ + VC_CALL_IND_TRANSFER, /**< Call transfer */ + VC_CALL_IND_SETUPCONFERENCE, /**< Setup conference */ + VC_CALL_IND_BARRING, /**< Call barring */ + VC_CALL_IND_WAITING, /**< Call waiting */ + VC_CALL_IND_CUGINFO, /**< Closed User Group information */ + VC_CALL_IND_SSNOTIFY, /**< SS nofify */ + VC_CALL_IND_CALLINGNAMEINFO, /**< Caller name information */ + VC_CALL_IND_REDIRECT_CNF, /**< Redirect confirmation */ + VC_CALL_IND_ACTIVATECCBS_CNF, /**< Activate CCBS confirmation */ + VC_CALL_IND_ACTIVATECCBS_USERINFO, /**< Activate CCBS user information */ + VC_CALL_IND_AOC, /**< AOC indication */ + + /*Tapi Response Error Related Events */ + VC_ERROR_OCCURED, /**< Error */ + + /* Voicecall Engine triggered Event Type */ + VC_ACTION_INCOM_FORCE, /**< If any outgoing data needs to be destroyed or cleaned up in the client during an incoming call, this event will be sent */ + VC_ACTION_SAT_REQUEST, /**< SAT Request. This event will be sent to client , when SAT Engine requests any service from voicecall. Voicecall Engine holds the SAT engine related information, clients can get the information from the engine when it is required */ + VC_ACTION_SAT_RESPONSE, /**< SAT Response */ + VC_ACTION_CALL_END_HELD_RETREIVED, /**< If a held call is being retreived on end of an active call, this event will be emitted */ + VC_ACTION_NO_ACTIVE_TASK, /**< This event will be published when engine becomes idle after executing/aborting a request from other apps - eg) if SAT request is not processed*/ + + VC_CALL_GET_VOLUME_RESP, /**< Response data from tapi for get tapi sound volume*/ + VC_ENGINE_EVENT_MAX +} voicecall_engine_event_t; + +/** + * This enum defines call forwarding indication types + */ +typedef enum _voicecall_forward_ind_type_t { + VC_FRWD_IND_INCOM_IS_FRWD, /**< Is incoming call a forwarded call? */ + VC_FRWD_IND_INCOM_FRWD, /**< Incoming call Forwarded */ + VC_FRWD_IND_OUTGOING_FRWD /**< Outgoing call Forwarded */ +} voicecall_forward_ind_type_t; + +/** + * This enum defines call barring indication types + */ +typedef enum _voicecall_barr_ind_type_t { + VC_BARR_IND_NONE, /**< No call barring indication */ + VC_BARR_IND_ALL, /**< Barring all outgoing and incoming calls */ + VC_BARR_IND_BAOC, /**< Bar All Outgoing Calls indication */ + VC_BARR_IND_BOIC, /**< Bar Outgoing International Calls indication */ + VC_BARR_IND_BOIC_EXHC, /**< Bar Outgoing International Calls EXcept Home Calls indication */ + VC_BARR_IND_BAIC, /**< Bar All Incoming Calls indication */ + VC_BARR_IND_BICROAM /**< Bar Incoming Calls when ROAMing indication */ +} voicecall_barr_ind_type_t; + +/** + * This enum defines supplementary services notificatoin indication types + */ +typedef enum _voicecall_ssnotify_ind_type_t { + VC_SSNOTIFY_IND_CFU, /**< SS CFU indication */ + VC_SSNOTIFY_IND_CFB, /**< SS CFB indication */ + VC_SSNOTIFY_IND_CFNRY, /**< SS CFNRY indication */ + VC_SSNOTIFY_IND_CFNRC, /**< SS CFNRC indication */ + VC_SSNOTIFY_IND_CLIR, /**< SS CLIR indication */ + VC_SSNOTIFY_IND_ALL_COND_FORWARDING, /**< SS all condtional call forwarding indication */ + VC_SSNOTIFY_IND_BARRING_OF_OUTGOING /**< SS Outging call baring indication */ +} voicecall_ssnotify_ind_type_t; + +/** + * This enum defines engine/ Input Output sate of call agent + */ +typedef enum { + VC_INOUT_STATE_NONE, /**< I/O state none */ + VC_INOUT_STATE_OUTGOING_START, /**< Outgoing enum value start */ + VC_INOUT_STATE_OUTGOING_WAIT_HOLD, /**< Outgoing wait for hold */ + VC_INOUT_STATE_OUTGOING_WAIT_ORIG, /**< Outgoing wait for Origination event */ + VC_INOUT_STATE_OUTGOING_WAIT_ALERT, /**< Outgoing wait alert */ + VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED, /**< Outgoing wait connected */ + VC_INOUT_STATE_OUTGOING_WAIT_RELEASE, /**< Outgoing wait release */ + VC_INOUT_STATE_OUTGOING_ABORTED, /**< Outgoing call aborted */ + VC_INOUT_STATE_OUTGOING_SHOW_REDIALCAUSE, /**< Outgoing show redial cause */ + VC_INOUT_STATE_OUTGOING_WAIT_REDIAL, /**< Outgoing wait redial */ + VC_INOUT_STATE_OUTGOING_SHOW_RETRY_CALLBOX, /**< Outgoing showing retry call box : not used*/ + VC_INOUT_STATE_OUTGOING_END, /**< Outgoing enum value end */ + + VC_INOUT_STATE_INCOME_SELFEVET_WAIT, /**< Incoming waiting for self event : not used*/ + VC_INOUT_STATE_INCOME_START, /**< Incoming enumvalue start */ + VC_INOUT_STATE_INCOME_BOX, /**< Incoming box */ + VC_INOUT_STATE_INCOME_WAIT_REDIRECTCNF, /**< Incoming wait for redirect confirmation : not used*/ + VC_INOUT_STATE_INCOME_WAIT_REDIRECT_END, /**< Incoming wait for redirect end : not used*/ + VC_INOUT_STATE_INCOME_WAIT_CONNECTED, /**< Incoming wait connected */ + VC_INOUT_STATE_INCOME_WAIT_HOLD_CONNECTED, /**< Incoming wait for hold and then connected event */ + VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVE_CONNECTED, /**< Incoming wait for release and then connected event */ + VC_INOUT_STATE_INCOME_WAIT_HOLD, /**< Incoming wait hold : not used*/ + VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVECALL, /**< Incoming wait release active call */ + VC_INOUT_STATE_INCOME_WAIT_RELEASE_HOLDCALL, /**< Incoming wait release hold call */ +#ifdef RELEASE_ALL_AND_ACCEPT_SUPPORT + VC_INOUT_STATE_INCOME_WAIT_RELEASE_HOLDCALL_FOR_ALL_RELEASE, /**< Incoming wait release hold call in case of release all and accept */ +#endif + VC_INOUT_STATE_INCOME_WAIT_RELEASE, /**< Incoming wait release call */ + VC_INOUT_STATE_INCOME_END, /**< Incoming enum value end */ + VC_INOUT_STATE_MAX_NUM /**< Max value */ +} voicecall_inout_state_t; + +/** + * This enum defines call answer types + */ +typedef enum _voicecall_answer_type_t { + VC_ANSWER_NORMAL, /**< Accepts the call in normal scenario(Only CONNECTED will be sent to the client) */ + VC_ANSWER_HOLD_ACTIVE_AND_ACCEPT, /**< Puts the active call on hold and accepts the call (Only CONNECTED will be sent to client) */ + VC_ANSWER_RELEASE_ACTIVE_AND_ACCEPT, /**< Releases the active call and accept the call (END and CONNECTED will be sent to Client) */ + VC_ANSWER_RELEASE_HOLD_AND_ACCEPT, /**< Releases the active call and accept the call (END and CONNECTED will be sent to client) */ +#ifdef RELEASE_ALL_AND_ACCEPT_SUPPORT + VC_ANSWER_RELEASE_ALL_AND_ACCEPT /**< Releases the all calls and accept the call (END and CONNECTED will be sent to client) */ +#endif +} voicecall_answer_type_t; + +/** + * This enum defines the cphs csp status names + */ +typedef enum _voicecall_cphs_csp_service { + /**< CPHS Teleservice*/ + VC_CPHS_CSP_ALS, /** + +/*Voicecall Engine Exposed API's */ + +void _vc_core_engine_handle_sat_events_cb(void *sat_setup_call_data, void *userdata); + +void _vc_core_engine_handle_incoming_tapi_events(void *mt_data, void *userdata); + +/** + * This function initializes the voicecall engine + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure + * @param[out] pcall_agent_out Pointer to the address of call agent +* @param[in] pcallback_func Call back function + * @param[in] puser_data Data set by user +* @remarks pcall_agent_out and pcallback_func cannot be NULL. + */ +voicecall_error_t _vc_core_engine_init(voicecall_engine_t **pcall_agent_out, voicecall_cb pcallback_func, void *puser_data); + +/** +* This function prepares the call setup info structure for making call + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] psetup_call_info Pointer to the call setup info structure. +* @remarks pvoicecall_agent and psetup_call_info cannot be NULL +* Only on successfull completion of this API, _vc_core_engine_make_call can be made +* @see See following API's also +* -_vc_core_engine_make_call +* -voicecall_clear_prepared_call + */ +voicecall_error_t _vc_core_engine_prepare_call(voicecall_engine_t *pvoicecall_agent, voicecall_setup_info_t *psetup_call_info); + +/** +* This function establishes an outgoing call with the details prepared using _vc_core_engine_prepare_call + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] mo_call_index Index of the prepare mo call +* @param[out] pcall_handle Handle of the MO Call Made +* @remarks pvoicecall_agent and pcall_handle cannot be NULL +* @see _vc_core_engine_end_call + */ +voicecall_error_t _vc_core_engine_make_call(voicecall_engine_t *pvoicecall_agent, int mo_call_index, int *pcall_handle); + +/** +* This function answers a call according to the given answer type + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] answer_type The answer type to be used +* @remarks pvoicecall_agent and pcall_handle cannot be NULL +* @see _vc_core_engine_reject_call + */ +voicecall_error_t _vc_core_engine_answer_call(voicecall_engine_t *pvoicecall_agent, voicecall_answer_type_t answer_type); + +/** +* This function rejects the incoming call if any +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] budub User Determined User Busy - TRUE, Else - FALSE +* @exception In case of exceptions return value contains appropriate error code. +* @remarks pvoicecall_agent cannot be NULL +* @see _vc_core_engine_answer_call +*/ +voicecall_error_t _vc_core_engine_reject_call(voicecall_engine_t *pvoicecall_agent, gboolean budub); + +/** +* This function ends the call according to the given end call type + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] end_call_type End Call Type +* @remarks pvoicecall_agent cannot be NULL +* @see See also following functions +* - _vc_core_engine_make_call +* - _vc_core_engine_end_call_byhandle +* - _vc_core_engine_end_call_bycallId +* . + */ +voicecall_error_t _vc_core_engine_end_call(voicecall_engine_t *pvoicecall_agent, _vc_core_engine_end_call_type_t end_call_type); + +/** +* This function ends only the connected call corresponding to the given call handle +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_handle Call handle of the call to be ended +* @remarks pvoicecall_agent cannot be NULL +* @see See also following functions +* - _vc_core_engine_make_call +* - _vc_core_engine_end_call +* - _vc_core_engine_end_call_bycallId + */ +voicecall_error_t _vc_core_engine_end_call_byhandle(voicecall_engine_t *pvoicecall_agent, int call_handle); + +/** +* This function ends a call corresponding to the given call ID + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_id call id of the call to be ended +* @remarks pvoicecall_agent cannot be NULL +* @see See also following functions +* - _vc_core_engine_make_call +* - _vc_core_engine_end_call +* - _vc_core_engine_end_call_byhandle + */ +voicecall_error_t _vc_core_engine_end_call_bycallId(voicecall_engine_t *pvoicecall_agent, int call_id); + +/** +* This function puts the active call if any on hold + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @remarks pvoicecall_agent cannot be NULL +* @see voicecall_retreive_call + */ +voicecall_error_t _vc_core_engine_hold_call(voicecall_engine_t *pvoicecall_agent); + +/** +* This function retrieves/activates the held call + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @remarks pvoicecall_agent cannot be NULL +* @see _vc_core_engine_hold_call + */ +voicecall_error_t _vc_core_engine_retrieve_call(voicecall_engine_t *pvoicecall_agent); + +/** +* This function swaps the active and held calls if any available + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @remarks pvoicecall_agent cannot be NULL +* @see See also the following APIs +* - _vc_core_engine_hold_call +* - _vc_core_engine_retrieve_call +* . + */ +voicecall_error_t _vc_core_engine_swap_calls(voicecall_engine_t *pvoicecall_agent); + +/** +* This function does the explicit call transfer + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @remarks pvoicecall_agent cannot be NULL + */ +voicecall_error_t _vc_core_engine_transfer_calls(voicecall_engine_t *pvoicecall_agent); + +/** +* This function sets up a conference beween the currently available active and held calls + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @remarks pvoicecall_agent cannot be NULL +* @see See also the following APIs +* - _vc_core_engine_private_call +* - _vc_core_engine_private_call_by_callid +* . + */ +voicecall_error_t _vc_core_engine_setup_conference(voicecall_engine_t *pvoicecall_agent); + +/** +* This function makes a private call to the given call member from the currently available active conference call + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_handle call handle of the call to be made private +* @remarks pvoicecall_agent cannot be NULL +* @see See also the following APIs +* - _vc_core_engine_setup_conference +* - _vc_core_engine_private_call_by_callid +* . + */ +voicecall_error_t _vc_core_engine_private_call(voicecall_engine_t *pvoicecall_agent, int call_handle); + +/** +* This function makes a private call to the call member corressponding to the given call id. + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_id Call ID of the call to be made private +* @remarks pvoicecall_agent cannot be NULL +* @see See also the following APIs +* - _vc_core_engine_setup_conference +* - _vc_core_engine_private_call +* . + */ +voicecall_error_t _vc_core_engine_private_call_by_callid(voicecall_engine_t *pvoicecall_agent, int call_id); + +/** +* This function sends the given dtmf digits + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] pdtmf_string dtmf digits to be sent +* @remarks pvoicecall_agent and pdtmf_string cannot be NULL + */ +voicecall_error_t _vc_core_engine_send_dtmf(voicecall_engine_t *pvoicecall_agent, char *pdtmf_string); + +/** +* This function clears the data of the given call type. + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_type call type +* @param[in] call_handle Call handle of the connected call to be cleared +* @remarks This will clear the call data only when the call data are currently not being used +* i,e) the data will be cleared only if the corresponding call is ended or the call data is not used at all. +* call_handle argument is required only in case of connected call, Engine ignores call_handle for other +* call types. + */ +voicecall_error_t _vc_core_engine_finalize_call(voicecall_engine_t *pvoicecall_agent, voicecall_call_type_t call_type, int call_handle); + +/** +* This function changes the inout state of the engine to the given state + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] io_state Inout state to be set +* @remarks pvoicecall_agent cannot be NULL +* @see _vc_core_engine_status_get_engine_iostate + */ +voicecall_error_t _vc_core_engine_change_engine_iostate(voicecall_engine_t *pvoicecall_agent, int io_state); + +/** + * This function extracts the call number from the given number + * + * @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure + * @param[in] source_tel_number source number + * @param[out] phone_number target number + * @param[in] buf_size target number buffer size + */ +voicecall_error_t _vc_core_engine_extract_phone_number(const char *source_tel_number, char *phone_number, const int buf_size); + +/** +* This function finalizes the voiecall engine and removes all allocated resources + * +* @return nothing + * @param[in] pvoicecall_agent Handle to Voicecall Engine +* @remarks pvoicecall_agent cannot be NULL + */ +void _vc_core_engine_engine_finish(voicecall_engine_t *pvoicecall_agent); + +/** +* This function changes the voice audio path + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure + * @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] audio_path audio path to be changed +* @remarks pvoicecall_agent cannot be NULL + */ +voicecall_error_t _vc_core_engine_change_audio_path(voicecall_engine_t *pvoicecall_agent, voicecall_audio_path_t audio_path); + +/** +* This function sets the voice call audio volume for the given audio path type + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure + * @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] audio_path_type audio path for the volume to be set +* @param[in] vol_level volume level +* @remarks pvoicecall_agent cannot be NULL + */ +voicecall_error_t _vc_core_engine_set_audio_volume(voicecall_engine_t *pvoicecall_agent, voicecall_audio_path_t audio_path_type, voicecall_audio_volume_t vol_level); + +/** +* This function sets the modem mute status +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] bmute_audio TRUE - mure audio, FALSE - unmute audio +* @remarks pvoicecall_agent cannot be NULL +*/ +voicecall_error_t _vc_core_engine_set_audio_mute(voicecall_engine_t *pvoicecall_agent, gboolean bmute_audio); + +/** +* This function retreives the voice call audio volume for the given audio path type + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure + * @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] audio_path_type audio path for the volume to be retreived +* @remarks pvoicecall_agent cannot be NULL + */ +voicecall_error_t _vc_core_engine_get_audio_volume(voicecall_engine_t *pvoicecall_agent, voicecall_audio_path_t audio_path_type); + +#ifdef _SAT_MENU_ +/** + * This function requests SAT Engine to setup SIM services Menu + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure + * @param[in] pvoicecall_agent Handle to Voicecall Engine +* @remarks Voicecall Engine only requests the SAT engine to display the menu. + */ +voicecall_error_t voicecall_request_sat_menu(voicecall_engine_t *pvoicecall_agent); + +/** +* This function retreives the SIM Menu Title from the SAT Engine + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure + * @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[out] title contains the sat menu title on sucess + */ +voicecall_error_t voicecall_request_sat_menu_title(voicecall_engine_t *pvoicecall_agent, char *title); +#endif + +/** +* This function prepares the engine for the redial call. It preserves the previsouly made call object to be used for the next make call + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure + * @param[in] pvoicecall_agent Handle to Voicecall Engine + * @param[in] call_handle call handle +* @remarks If this API is used, _vc_core_engine_prepare_call is not reqired for making the call again. The last prepared call details will +* be used for the redialling. Application has to just use _vc_core_engine_make_call API to redial the call + */ +voicecall_error_t _vc_core_engine_prepare_redial(voicecall_engine_t *pvoicecall_agent, int call_handle); + +#ifdef _OLD_SAT_ +/** + * This function checks whether SAT redial duration is valid + * + * @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure + * @param[in] pvoicecall_agent Handle to Voicecall Engine + * @param[out] bredial_duration Contains TRUE if SAT redial duration is enabled, FALSE otherwise + * @remarks pvoicecall_agent and bredial_duration cannot be NULL + */ +voicecall_error_t voicecall_get_sat_redial_duration_status(voicecall_engine_t *pvoicecall_agent, gboolean * bredial_duration); + +/** + * This function sets the current duration and retireives the modified remaining SAT redial duration + * + * @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure + * @param[in] pvoicecall_agent Handle to Voicecall Engine + * @param[out] remaining_duration remaining sat duration + * @remarks pvoicecall_agent and remaining_duration cannot be NULL + */ +voicecall_error_t voicecall_get_set_sat_remaining_duration(voicecall_engine_t *pvoicecall_agent, long *remaining_duration); +#endif + +voicecall_error_t _vc_core_engine_get_sat_dtmf_hidden_mode(voicecall_engine_t *pvoicecall_agent, gboolean * bhidden_mode); + +/** +* This function sends response to sat based on the given sat response type + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] sat_rqst_resp_type sat rqst/response type sent by client +* @param[in] sat_response_type sat response type to be sent to SAT + */ +voicecall_error_t _vc_core_engine_send_sat_response(voicecall_engine_t *pvoicecall_agent, voicecall_engine_sat_rqst_resp_type sat_rqst_resp_type, call_vc_sat_reponse_type_t sat_response_type); + +voicecall_error_t _vc_core_engine_set_to_default_values(voicecall_engine_t *pvoicecall_agent); +#endif /* __VC_CORE_ENGINE_H_ */ diff --git a/call-engine/core/include/vc-core-error.h b/call-engine/core/include/vc-core-error.h new file mode 100755 index 0000000..95d4345 --- /dev/null +++ b/call-engine/core/include/vc-core-error.h @@ -0,0 +1,88 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VC_CORE_ERROR_H_ +#define __VC_CORE_ERROR_H_ + +/** + * Voicecall Engine Error Codes + */ + +typedef enum __voicecall_api_error_t { + ERROR_VOICECALL_NONE, /*0 */ + ERROR_VOICECALL_INVALID_CALL_TYPE, + ERROR_VOICECALL_INVALID_TELEPHONE_NUMBER, + ERROR_VOICECALL_MEMALLOC_FAILURE, + ERROR_VOICECALL_DBUS_FAILURE, + ERROR_VOICECALL_INVALID_MO_REF_HANDLE, + ERROR_VOICECALL_INVALID_CALL_HANDLE, + ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE, + ERROR_VOICECALL_CALL_NOT_ALLOWED, + ERROR_VOICECALL_NOT_SUPPORTED, + ERROR_VOICECALL_INVALID_ACTION_TYPE, /*10 */ + ERROR_VOICECALL_TAPI_ERROR, + ERROR_VOICECALL_FDN_ONLY, + ERROR_VOICECALL_EMERGENCY_CALLS_ONLY, + ERROR_VOICECALL_OUTGOING_ABORTED, + ERROR_VOICECALL_ENGINE_STATE_NOT_NONE, + ERROR_VOICECALL_EMPTY_SPEED_DIAL, + ERROR_VOICECALL_CONTACT_READ_FAILED, + ERROR_VOICECALL_MO_CALL_NOT_AVAILABLE, + ERROR_VOICECALL_NO_NW_SERVICE, + ERROR_VOICECALL_TAPI_CAUSE_CALL_FAILED, /*20 */ + ERROR_VOICECALL_NO_INCOMING_CALL_EXIST, + ERROR_VOICECALL_ENGINE_STATE_NONE, + ERROR_VOICECALL_BOTH_ACTIVE_HELD_CALLS_EXIST, + ERROR_VOICECALL_OFFLINE_MODE, + ERROR_VOICECALL_CALL_IMPOSSIBLE_NOSIM_NOEMERGNUM, + ERROR_VOICECALL_PHONE_NOT_INITIALIZED, + ERROR_VOICECALL_HOLD_REJECTED, + ERROR_VOICECALL_ACTIVATE_REJECTED, + ERROR_VOICECALL_SWAP_REJECTED, + ERROR_VOICECALL_HOLD_FAILED, /*30 */ + ERROR_VOICECALL_RETREIVE_FAILED, + ERROR_VOICECALL_SETUP_CONF_FAILED, + ERROR_VOICECALL_SPLIT_CONF_FAILED, + ERROR_VOICECALL_SWAP_FAILED, + ERROR_VOICECALL_TRANSFER_FAILED, + ERROR_VOICECALL_INCOMPLETE, + ERROR_VOICECALL_UNAVAILABLE, + ERROR_VOICECALL_HOLD_NOT_SUPPORTED, + ERROR_VOICECALL_RETREIVE_NOT_SUPPORTED, + ERROR_VOICECALL_SETUP_CONF_NOT_SUPPORTED, /*40 */ + ERROR_VOICECALL_SPLIT_CONF_NOT_SUPPORTED, + ERROR_VOICECALL_SWAP_NOT_SUPPORTED, + ERROR_VOICECALL_TRANSFER_NOT_SUPPORTED, + ERROR_VOICECALL_DTMF_FAILED, + ERROR_VOICECALL_ANSWER_FAILED, + ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS, + ERROR_VOICECALL_INSUFFICIENT_BUFFER, + ERROR_VOICECALL_INVALID_ARGUMENTS, + ERROR_VOICECALL_NOTI_FAILED, + ERROR_VOICECALL_OPERATION_NOT_ALLOWED, /*50 */ + ERROR_VOICECALL_REQUEST_FAILED, + ERROR__vc_core_engine_private_call_NOT_POSSIBLE, + ERROR_VOICECALL_TRANSFER_CALL_NOT_POSSIBLE, + ERROR_VOICECALL_CONF_NOT_POSSIBLE, + ERROR_VOICECALL_INVALID_CALLID, + ERROR_VOICECALL_CALL_IS_IN_PROGRESS, + ERROR__vc_core_engine_private_call_FAILED, + ERROR_VOICECALL_INVALID_DTMF_CHAR, /*58 */ + ERROR_VOICECALL_MAX +} voicecall_error_t; + +#endif /*__VC_CORE_ERROR_H_*/ diff --git a/call-engine/core/include/vc-core-svcall.h b/call-engine/core/include/vc-core-svcall.h new file mode 100755 index 0000000..7f8ab6b --- /dev/null +++ b/call-engine/core/include/vc-core-svcall.h @@ -0,0 +1,50 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VC_CORE_SVCALL_H_ +#define __VC_CORE_SVCALL_H_ +#include "vc-core-callagent.h" + +#ifdef _CPHS_DEFINED_ + +/** + * This function retrieves cphs information from the Telephony and stores with the engine + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Handle to Voicecall Call Agent + */ +gboolean _vc_core_svcall_init_cphs_info(call_vc_callagent_state_t *pcall_agent); + +/** + * This function retrieves status of the given csp service type + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Handle to Voicecall Call Agent + * @param[in] csp_service csp service whose status to be retreived + */ +gboolean _vc_core_svcall_cphs_csp_get_status(call_vc_callagent_state_t *pcall_agent, voicecall_cphs_csp_service csp_service); + +/** + * This function retrieves cuurent active line in ALS + * + * @return Returns #voice_call_cphs_alsline_t + * @param[in] pcall_agent Handle to Voicecall Call Agent + */ +voice_call_cphs_alsline_t _vc_core_svcall_get_cphs_als_active_line(call_vc_callagent_state_t *pcall_agent); +#endif + +#endif /*__VC_CORE_SVCALL_H_*/ diff --git a/call-engine/core/include/vc-core-tapi-evnt.h b/call-engine/core/include/vc-core-tapi-evnt.h new file mode 100755 index 0000000..bf41865 --- /dev/null +++ b/call-engine/core/include/vc-core-tapi-evnt.h @@ -0,0 +1,171 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VC_CORE_TAPI_EVENT_H_ +#define __VC_CORE_TAPI_EVENT_H_ + +#include "vc-core-util.h" +#include "vc-core-callagent.h" +#include "vc-core-engine.h" + +/** + * This function handles the tapi connected line indication handle + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle Tapi Call Handle associtated with connected line indication + */ +gboolean _vc_core_tapi_event_connected_line_ind_handle(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallConnectedNumberInfo_t *connected_number_info); + +/** + * This function handles different type of tapi indications given in tapi_event_type + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] tapi_event_type Tapi Event Type + * @param[in] param2 sub param associated with tapi_event_type + */ +gboolean _vc_core_tapi_event_handle_notification(call_vc_callagent_state_t *pcall_agent, int tapi_event_type, int param2); + +/** + * This function handles the AOC Event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle Pointet to SAT engine return call structure + * @param[in] ptapi_aoc_info AOC info associated with the AOC Event + */ +gboolean _vc_core_tapi_event_handle_aoc(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallAocInfo_t *pTapiAocInfo); + +/** + * This function retreives the voicecall engine specific end cause type for the given tapi end cause type + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] type tapi event type + * @param[in] cause tapi call end cause + * @param[out] end_cause_type voicecall engine end cause + */ +void _vc_core_tapi_event_get_end_cause_type(int type, TelTapiEndCause_t cause, voice_call_end_cause_type_t *end_cause_type); + +/** +* This function Copies Telephony incoming call data to voice call incoming call data +* +* @return void +* @param[in] pcall_agent Handle to voicecall agent +* @param[in] callInfo Telephony Incoming Call Data +* @param[out] pcallobject_info Voicecall Engine Incoming Call Dta +*/ +void _vc_core_tapi_event_copy_incoming_call_data(call_vc_callagent_state_t *pcall_agent, TelCallIncomingCallInfo_t *callInfo, call_vc_call_objectinfo_t *pcallobject_info); + +/** + * This function handles the incoming event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle Incoming call handle + * @param[in] callInfo Incoming call info associated with the incoming call + */ +gboolean _vc_core_tapi_event_handle_incoming_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallIncomingCallInfo_t *callInfo); + +/** + * This function handles tapi origination event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle Call Handle associated with the alert event + */ +gboolean _vc_core_tapi_event_handle_originated_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle); + +/** + * This function handles tapi alert event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle Call Handle associated with the alert event + */ +gboolean _vc_core_tapi_event_handle_alert_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle); + +/** + * This function handles the call end event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] type Tapi Event Type + * @param[in] handle Call Handle of the call being ended + * @param[in] cause Tapi End Cause + */ +gboolean _vc_core_tapi_event_handle_call_end_event(call_vc_callagent_state_t *pcall_agent, int type, call_vc_handle handle, TelTapiEndCause_t cause); + +/** + * This function handles the tapi call connect event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle call handle assoicated with the call being connected + */ +gboolean _vc_core_tapi_event_handle_call_connect_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle); + +/** + * This function handles call hold event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle call handle assoicated with the call being held + * @param[in] status tapi cause incase of hold failed + */ +gboolean _vc_core_tapi_event_handle_call_held_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status); + +/** + * This function handles tapi call activate/retreive event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle call handle assoicated with the call being held + * @param[in] status tapi cause incase of hold failed + */ +gboolean _vc_core_tapi_event_handle_call_retrieve_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status); + +/** + * This function handles call join/conference event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle call handle assoicated with the call being held + * @param[in] status tapi cause incase of hold failed + */ +gboolean _vc_core_tapi_event_handle_call_join_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status); + +/** + * This function handles call split/private call event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle call handle assoicated with the call being held + * @param[in] status tapi cause incase of hold failed + */ +gboolean _vc_core_tapi_event_handle_call_split_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status); + +/** + * This function handles the call transfer event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] status tapi cause incase of hold failed + */ +gboolean _vc_core_tapi_event_handle_call_transfer_event(call_vc_callagent_state_t *pcall_agent, TelCallCause_t status); + +#endif /* __VC_CORE_TAPI_EVENT_H_ */ diff --git a/call-engine/core/include/vc-core-tapi-rqst.h b/call-engine/core/include/vc-core-tapi-rqst.h new file mode 100755 index 0000000..f582665 --- /dev/null +++ b/call-engine/core/include/vc-core-tapi-rqst.h @@ -0,0 +1,186 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VC_CORE_TAPI_RQST_H_ +#define __VC_CORE_TAPI_RQST_H_ + +#include "vc-core-util.h" +#include "vc-core-callagent.h" + + /** + * This function prepares for a call setup + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_prepare_setup_call(call_vc_callagent_state_t *pcall_agent); + + /** + * This function sets up an outgoing call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_setup_call(call_vc_callagent_state_t *pcall_agent); + +/* + * Function to answer/release calls, + */ + /** + * This function answers the call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] answer_type call answer type #voicecall_answer_type_t + * @param[out] error_code Error code + */ +gboolean _vc_core_tapi_rqst_answer_call(call_vc_callagent_state_t *pcall_agent, voicecall_answer_type_t answer_type, int *error_code); + +/** + * This function checks and prepares to accept a call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_response_call(call_vc_callagent_state_t *pcall_agent); + +/** + * This function rejects a mobile terminated call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] budub TRUE - User Determined User Busy, FALSE - otherwise + * @param[out] error_code Error code + */ +gboolean _vc_core_tapi_rqst_reject_mt_call(call_vc_callagent_state_t *pcall_agent, gboolean budub, int *error_code); + +/** + * This function ends a call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_end_call(call_vc_callagent_state_t *pcall_agent); + +/** + * This function releases active calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_release_active_calls(call_vc_callagent_state_t *pcall_agent); + +/** + * This function releases held calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_release_held_calls(call_vc_callagent_state_t *pcall_agent); + +/** + * This function releases the incoming call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_release_incoming_call(call_vc_callagent_state_t *pcall_agent); + +/** + * This function releases outgoing call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_release_outgoing_call(call_vc_callagent_state_t *pcall_agent); + +/** + * This function releases all calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_release_all_calls(call_vc_callagent_state_t *pcall_agent); + +/** + * This function releases the call associate with the given call handle + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle handle of the call to be ended + */ +gboolean _vc_core_tapi_rqst_end_call_by_callhandle(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle); + +/** + * This function holds a call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_hold_call(call_vc_callagent_state_t *pcall_agent); + +/** + * This function retrieves a call from hold + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_retrieve_call(call_vc_callagent_state_t *pcall_agent); + +/** + * This function swaps held and active calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_swap_calls(call_vc_callagent_state_t *pcall_agent); + +/** + * This function joins two calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_join_calls(call_vc_callagent_state_t *pcall_agent); + +/** + * This function splits the members of a call given its call handle + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + * @param[in] call_handle Call handle for a call the members of which has to be split + */ +gboolean _vc_core_tapi_rqst_private_call(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle); + +/** + * This function transfers call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_transfer_call(call_vc_callagent_state_t *pcall_agent); + +/** + * This function sends the given string as dtmf + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + * @param[in] dtmf_string dtmf string + */ +gboolean _vc_core_tapi_rqst_start_dtmf(call_vc_callagent_state_t *pcall_agent, char *dtmf_string); + +#endif /* __VC_CORE_TAPI_RQST_H_ */ diff --git a/call-engine/core/include/vc-core-util.h b/call-engine/core/include/vc-core-util.h new file mode 100755 index 0000000..c18bf1c --- /dev/null +++ b/call-engine/core/include/vc-core-util.h @@ -0,0 +1,300 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VC_CORE_UTIL_H_ +#define __VC_CORE_UTIL_H_ + +#include +#include +#include +#include +#include +#include +#include +#include "vc-core-error.h" +#include "vc-core-engine-types.h" + +#include "TelDefines.h" +#include "TelNetwork.h" +#include "TelSim.h" +#include "TapiCommon.h" +#include "TapiEvent.h" +#include "ITapiCall.h" +#include "ITapiSim.h" +#include "ITapiNetwork.h" +#include "ITapiSound.h" +#include "ITapiSs.h" +#include "ITapiSat.h" + +#include "vconf.h" +#include "vconf-keys.h" +#include "contacts-svc.h" +#ifdef CALL_DEBUG_ON_DLOG +#include +#endif + +#define CALL_NETWORK_MCC_UK 0xEA /*234*/ +#define CALL_NETWORK_MCC_IE 0x110 /*272*/ +#define CALL_NETWORK_MCC_UKRAINE 0xFF /*255*/ +#define CALL_NETWORK_MCC_SAMSUNG_SUWON_3G 450001 /*450001*/ +#define CALL_NETWORK_MCC_ITALY 222 + +#define IS_DIGIT(value) ((value) >= '0' && (value) <= '9') + +#ifdef CALL_DEBUG_ON_DLOG +#define ENG_ERR LOG_ERROR +#define ENG_WARN LOG_WARN +#define ENG_DEBUG LOG_DEBUG +#else +#define ENG_ERR +#define ENG_WARN +#define ENG_DEBUG +#endif + +#ifdef CALL_DEBUG_ON_DLOG +#define CALL_ENG_DEBUG(level, frmt, args...) \ + do {LOG(level, TAG_CALL, "[VC_ENGINE] [%s:%d] "frmt"\n", __func__, __LINE__, ##args); } while (0) +#define CALL_ENG_KPI(frmt, args...) \ + do {LOG(LOG_DEBUG, TAG_CALL_LAUNCH, "[VC_KPI] [%s:%d] "frmt"\n", __func__, __LINE__, ##args); } while (0) +#else +#define CALL_ENG_DEBUG(level, fmt, args...) +#endif + +#define VOICECALL_RETURN_IF_FAIL(check_condition) \ + if (!(check_condition)) return; + +#define VOICECALL_RETURN_FALSE_IF_FAIL(check_condition) \ + if (!(check_condition)) return FALSE; + +#define VOICECALL_RETURN_VALUE_IF_FAIL(check_condition, value) \ + if (!(check_condition)) return value; + +#define VOICECALL_RETURN_NULL_IF_FAIL(check_condition) \ + if (!(check_condition)) return NULL; + +#define VOICECALL_RETURN_ZERO_IF_FAIL(check_condition) \ + if (!(check_condition)) return 0; + +#define VOICECALL_RETURN_INVALID_IF_FAIL(check_condition) \ + if (!(check_condition)) return -1; + +#define VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(value, min_value, max_value, ret_val) \ + if ((value < min_value) || (value > max_value)) return ret_val; + +#ifndef min +#define min(a, b) (((a) < (b)) ? (a) : (b)) +#endif /*#ifndef min*/ + +typedef unsigned int call_vc_handle; + +#ifdef TIMER_ENABLED +#define GET_CURR_TIME() _vc_core_util_get_curr_time() +#define PRINT_DIFF_TIME(start, end, message) _vc_core_util_print_diff_time(start, end, message) +#define PRINT_CURRENT_TIME(message) _vc_core_util_print_curr_time(message) + +#else +#define GET_CURR_TIME() 0 +#define PRINT_DIFF_TIME(start, end, message) +#define PRINT_CURRENT_TIME(message) +#endif + +/** + * This enumeration defines SS's SI vaild types + */ +typedef enum { + SS_SI_FORMAT_INVALID = -1, /**< SI format is invalid */ + SS_SI_FORMAT_VALID /**< SI format is valid */ +} call_vc_ss_si_format; + +/** + * This enumeration defines the publish types + */ +typedef enum { + CALL_VC_SAT_RESPONSE /**< SAT response publish type */ +} call_vc_publish_type_t; + +/** + * This enum defines the type of power mode. + */ +typedef enum { + CALL_VC_POWER_NONE = 0, + CALL_VC_POWER_GRANT_DIMMING, + CALL_VC_POWER_GRANT_LCDOFF, + CALL_VC_POWER_GRANT_SLEEP, + CALL_VC_POWER_PROHIBIT_DIMMING, + CALL_VC_POWER_PROHIBIT_LCDOFF, + CALL_VC_POWER_PROHIBIT_SLEEP, + CALL_VC_POWER_NORMAL_STATUS +} call_vc_power_mode_t; + +/** + * This function publishes the event of a given publish type + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] src Telehone number from which call number needd to be parsed + * @param[out] dst Pointer to the buffer to store the parsed number + */ +gboolean _vc_core_util_remove_invalid_chars(const char *src, char *dst); + +/** + * This function publishes the event of a given publish type + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pszTelNumber Telehone number from which call number nned to be extracted + * @param[out] pBuffer Pointer to the buffer to store the extracted number + * @param[in] nBufSize Size of input buffer + */ +gboolean _vc_core_util_extract_call_number(const char *pszTelNumber, char *pBuffer, const int nBufSize); +gboolean _vc_core_util_extract_call_number_without_cli(const char *pszTelNumber, char *pBuffer, const int nBufSize); + +#ifdef TIMER_CHECK /*unused*/ +void call_vc_print_elapsed_time(char *string, gulong * tim_out); +void call_vc_print_diff_time(time_t time1, time_t time2); +#endif + +/** + * This function checks whether the given number is emergency number by verifying with sim emergency numbers + * + * @return TRUE if the number is emergency number, FALSE otherwise + * @param[in] card_type simcard type + * @param[in] pNumber number to be verified + */ +gboolean _vc_core_util_check_emergency_number(TelSimCardType_t card_type, char *pNumber, gboolean b_is_no_sim, int *ecc_category); + +/** + * This function checks whether the given number is SS string or not + * + * @return TRUE if the number is SS string, FALSE otherwise + * @param[in] pNumber number to be verified + */ +gboolean _vc_core_util_check_ss_string(const char *pNumber); + +/** + * This function checks whether the given number is SS string or not + * + * @return TRUE if the number is in call SS string, FALSE otherwise + * @param[in] pNumber number to be verified + */ +gboolean _vc_core_util_check_incall_ss_string(const char *number); + +/*PDIAL_SEND_DTMF*/ +/** +* This function extracts the dtmf number from the given telephone number +* +* @param[in] tel_number source telephone number +* @param[out] dtmf_number extracted dtmf number +* @param[out] dtmf_buf_len size of dtmf number buffer +*/ +gboolean _vc_core_util_extract_dtmf_number(const char *tel_number, char *dtmf_number, const int dtmf_buf_len); +/*PDIAL_SEND_DTMF*/ + +/** + * This function checks whether the given number ia a valid dtmf number or not + * + * @return TRUE if the number can be used for sending dtmf , FALSE otherwise + * @param[in] pnumber number to be verified + */ +gboolean _vc_core_util_isvalid_dtmf_number(char *pnumber); + +/** +* This function checks whether the entire dtmf string is valid or not +* +* @return TRUE if the number can be used for sending dtmf , FALSE otherwise +* @param[in] pnumber number to be verified +*/ +gboolean _vc_core_util_isvalid_full_dtmf_number(char *pnumber); + +/** +* This function checks the validity of the given string for SS string +* +* @return Returns SS_SI_FORMAT_INVALID - if the string is invalid ss string, SS_SI_FORMAT_VALID - if valid +* @param[in] pinput_string string to be verified +*/ +call_vc_ss_si_format _vc_core_util_check_si_format(const char *pinput_string); + +/** +* This function checks the validity of the given telephone number +* +* @return TRUE if the given number is valid telephone number, FALSE otherwise +* @param[in] ptel_number telephone number to be verified +*/ +gboolean _vc_core_util_isvalid_telephone_number(char *ptel_number); + +/** +* This function checks the if it is GCF mode or not +* +* @return TRUE if it is GCF mode, FALSE otherwise +*/ +gboolean _vc_core_util_check_gcf_status(void); + +/** +* This function checks the if it is in zuhause area or not +* +* @return TRUE if it is in zuhause area, FALSE otherwise +*/ +gboolean _vc_core_util_check_zuhause_status(void); + +/** +* This function retreive mcc information from the telephony +* +* @internal +* @return TRUE on success, FALSE - otherwise +* @param[out] mcc mcc information to be retreived +*/ +gboolean _vc_core_util_get_mcc(unsigned long *mcc); + +gboolean _vc_core_util_set_call_status(int call_status); +gboolean _vc_core_util_check_video_call_status(void); +gboolean _vc_core_util_get_SAP_status(); +void _vc_core_util_get_cug_info(voicecall_setup_info_t *psetupcall_info); +void _vc_core_util_get_identity_mode(voicecall_setup_info_t *psetupcall_info); +gboolean _vc_core_util_is_offline_mode(void); +gboolean _vc_core_util_is_pwlock(void); +gboolean _vc_core_util_get_nw_status(int *network_status); +gboolean _vc_core_util_strcpy(char *pbuffer, int buf_count, const char *pstring); + +/** + * This function make the date and time string + * + * @return Returns newly copied string on success or NULL on failure + * @param[out] pbuffer Target Buffer + * @param[in] time time + */ +char *_vc_core_util_get_date_time(time_t time); + +/** + * This function check phone lock status + * + * @return Returns whether phone is locked or not. + * @param[in] void + */ +gboolean _vc_core_util_phonelock_status(void); + +gboolean _vc_core_util_set_sleep_status(call_vc_power_mode_t type); +gboolean _vc_core_util_get_call_alert_type(int *alert_type); + +#ifdef TIMER_ENABLED /*unused*/ +clock_t _vc_core_util_get_curr_time(); +void _vc_core_util_print_diff_time(clock_t start, clock_t end, char *message); +void _vc_core_util_print_curr_time(char *message); +#endif + +void _vc_core_util_download_test_call(char *result); + +gboolean _vc_core_util_set_call_volume(int vol_level); +int _vc_core_util_get_call_volume(void); +#endif /* __VC_CORE_UTIL_H_ */ diff --git a/call-engine/core/vc-core-callagent.c b/call-engine/core/vc-core-callagent.c new file mode 100755 index 0000000..8c68abb --- /dev/null +++ b/call-engine/core/vc-core-callagent.c @@ -0,0 +1,591 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "vc-core-callagent.h" +#include "vc-core-engine.h" +#include "vc-core-ccbs.h" +#include "vc-core-tapi-rqst.h" +#include "vc-core-tapi-evnt.h" +#include "vc-core-svcall.h" +#include + +/* For Debug Information, Inout state name string constant */ +char *gszcall_vc_inout_state[VC_INOUT_STATE_MAX_NUM] = { + "NONE", + "OUTGOING_START", + "OUTGOING_WAIT_HOLD", + "OUTGOING_WAIT_ORIG", + "OUTGOING_WAIT_ALERT", + "OUTGOING_WAIT_CONNECTED", + "OUTGOING_WAIT_RELEASE", + "OUTGOING_ABORTED", + "OUTGOING_SHOW_REDIALCAUSE", + "OUTGOING_WAIT_REDIAL", + "OUTGOING_SHOW_RETRY_CALLBOX", + "OUTGOING_END", + "INCOME_SELFEVENT_WAIT", + "INCOME_START", + "INCOME_BOX", + "INCOME_WAIT_REDIRECTCNF", + "INCOME_WAIT_REDIRECT_END", + "INCOME_WAIT_CONNECTED", + "INCOME_WAIT_HOLD_CONNECTED", + "INCOME_WAIT_RELEASE_ACTIVE_CONNECTED", + "INCOME_WAIT_HOLD", + "INCOME_WAIT_RELEASE_ACTIVECALL", + "INCOME_WAIT_RELEASE_HOLDCALL", + "INCOME_WAIT_RELEASE", + "INCOME_END" +}; + +/* For Debug Information, Call Agent State name string constant */ +char *gszcall_vc_ca_state[CALL_VC_CA_STATE_MAX_NUM] = { + "CA_STATE_NORMAL", + "CA_STATE_SPLIT_CALLBOX", + "CA_STATE_WAIT_SPLIT", + "CA_STATE_DROP_CALLBOX", + "CA_STATE_WAIT_DROP", +#ifdef SWAP_SUPPORT + "CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE", + "CA_STATE_WAIT_SWAP_HOLD", + "CA_STATE_WAIT_SWAP_ACTIVATE", +#endif /* */ + "CA_STATE_WAIT_SWAP", + "CA_STATE_WAIT_HOLD", + "CA_STATE_WAIT_UNHOLD", + "CA_STATE_WAIT_JOIN", + "CA_STATE_WAIT_TRANSFER_CNF", + "CA_STATE_WAIT_TRANSFER_CALLEND", + "CA_STATE_WAIT_RELEASE_ALL_ACTIVECALL", + "CA_STATE_WAIT_RELEASE_ALL_HOLDCALL", + "CA_STATE_SENDMSG_CALLBOX", + "CA_STATE_VIEW_CONTACT_DETAIL_CALLBOX", + "CA_STATE_SAVE_TO_CONTACT_CALLBOX", + "CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL", + "CA_STATE_WAIT_RELEASE_ALL_CALLS", + "CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SETUP", + "CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SWITCH_TO_VIDEO_CALL" +}; + +/** + * This function intializes the call agent + * + * @return Pointer to call agent state. + */ +call_vc_callagent_state_t *_vc_core_ca_init_agent() +{ + call_vc_callagent_state_t *pcall_agent = NULL; + pcall_agent = (call_vc_callagent_state_t *)calloc(1, sizeof(call_vc_callagent_state_t)); + if (NULL == pcall_agent) { + CALL_ENG_DEBUG(ENG_DEBUG, "Voicecall Engine Initialization Failed: MEM ALLOC Failure"); + return NULL; + } + + /*Initialize Call Manager */ + _vc_core_call_manager_init(&pcall_agent->call_manager); + + /* Initialize Call Agent Flags */ + _vc_core_ca_init_data(pcall_agent); + +#ifdef _CCBS_DEFINED_ + /* Init CCBS Info */ + _vc_core_init_ccbs_info(pcall_agent); +#endif + + /* Init CPHS Info */ +#ifdef _CPHS_DEFINED_ + _vc_core_svcall_init_cphs_info(pcall_agent); +#endif + return pcall_agent; +} + +/** + * This function intializes the callagent data + * + * @return void + * @param[in] pagent Pointer to the call agent structure + */ +void _vc_core_ca_init_data(call_vc_callagent_state_t *pagent) +{ + VOICECALL_RETURN_IF_FAIL(pagent != NULL); + pagent->bonly_sos_call = FALSE; + pagent->callagent_state = CALL_VC_CA_STATE_NORMAL; + pagent->io_state = VC_INOUT_STATE_NONE; + pagent->bis_no_sim = FALSE; + pagent->aoc_ppm = VC_INVALID_PPM; +} + +/** + * This function finalizes the call agent + * + * @return Returns void + * @param[in] pcall_agent Pointer to the call agent structure + */ +void _vc_core_ca_finish_agent(call_vc_callagent_state_t *pcall_agent) +{ + if (NULL != pcall_agent) { + free(pcall_agent); + pcall_agent = NULL; + } +} + +/** + * This function changes the in out state of the call agent + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pagent Pointer to the call agent structure + * @param[in] new_state The new i/o state that should be set + * @see _vc_core_ca_change_agent_state + */ +gboolean _vc_core_ca_change_inout_state(call_vc_callagent_state_t *pagent, voicecall_inout_state_t new_state) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pagent != NULL); + + CALL_ENG_DEBUG(ENG_ERR, "%s(%d) --> %s(%d)", gszcall_vc_inout_state[pagent->io_state], pagent->io_state, gszcall_vc_inout_state[new_state], new_state); + pagent->io_state = new_state; + return TRUE; +} + +/** + * This function changes the in call agent state + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pAgent Pointer to the call agent structure + * @param[in] new_state The new call agent state that should be set + * @see _vc_core_ca_change_inout_state + */ +gboolean _vc_core_ca_change_agent_state(call_vc_callagent_state_t *pAgent, call_vc_ca_state_t new_state) +{ + VOICECALL_RETURN_FALSE_IF_FAIL((new_state >= CALL_VC_CA_STATE_NORMAL && new_state < CALL_VC_CA_STATE_MAX_NUM)); + CALL_ENG_DEBUG(ENG_DEBUG, "%s(%d) --> %s(%d)", gszcall_vc_ca_state[pAgent->callagent_state], pAgent->callagent_state, gszcall_vc_ca_state[new_state], new_state); + pAgent->callagent_state = new_state; + return TRUE; +} + +/** + * This function checks if all the call members have terminated or not + * + * @return Returns TRUE if no call members exist, FALSE otherwise + * @param[in] pAgent Pointer to the call agent structure + */ +gboolean _vc_core_ca_check_end(call_vc_callagent_state_t *pAgent) +{ + gboolean result = FALSE; + VOICECALL_RETURN_FALSE_IF_FAIL(pAgent != NULL); + if ((_vc_core_cm_get_call_member_count(&pAgent->call_manager) == 0) && (pAgent->io_state == VC_INOUT_STATE_NONE)) { + CALL_ENG_DEBUG(ENG_DEBUG, "TRUE"); + result = TRUE; + } + + else { + CALL_ENG_DEBUG(ENG_DEBUG, "FALSE"); + result = FALSE; + } + return result; +} + + +/** + * This function sends the response to the SAT engine + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pagent Pointer to the call agent structure + * @param[in] sat_rqst_resp_type sat rquest/response type used by the client + * @param[in] sat_response_type response to be sent to sat + */ +gboolean _vc_core_ca_send_sat_response(call_vc_callagent_state_t *pagent, voicecall_engine_sat_rqst_resp_type sat_rqst_resp_type, call_vc_sat_reponse_type_t sat_response_type) +{ + call_vc_satsetup_info_t *pcall_vc_satcall_info = (call_vc_satsetup_info_t *) &(pagent->call_manager.setupcall_info.satcall_setup_info); + TelSatAppsRetInfo_t call_vc_sat_response = {0,}; + TapiResult_t error_code; + CALL_ENG_DEBUG(ENG_DEBUG, "sat_rqst_resp_type: %d, sat_response_type: %d", sat_rqst_resp_type, sat_response_type); + switch (sat_rqst_resp_type) { + case SAT_RQST_SETUP_CALL: + { + TelSatCallRetInfo_t sat_engine_ret_call = {0,}; + switch (sat_response_type) { + case CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND: + sat_engine_ret_call.resp = TAPI_SAT_R_ME_UNABLE_TO_PROCESS_COMMAND; + sat_engine_ret_call.bIsTapiCauseExist = FALSE; + sat_engine_ret_call.tapiCause = TAPI_CAUSE_UNKNOWN; + sat_engine_ret_call.meProblem = TAPI_SAT_ME_PROBLEM_ME_BUSY_ON_CALL; + sat_engine_ret_call.bIsOtherInfoExist = FALSE; + sat_engine_ret_call.permanentCallCtrlProblem = TAPI_SAT_CC_PROBLEM_NO_SPECIFIC_CAUSE; + break; + case CALL_VC_NETWORK_UNABLE_TO_PROCESS_COMMAND: + sat_engine_ret_call.resp = TAPI_SAT_R_NETWORK_UNABLE_TO_PROCESS_COMMAND; + sat_engine_ret_call.bIsTapiCauseExist = TRUE; + sat_engine_ret_call.tapiCause = TAPI_CAUSE_BUSY; + sat_engine_ret_call.meProblem = TAPI_SAT_ME_PROBLEM_NO_SERVICE; + sat_engine_ret_call.bIsOtherInfoExist = FALSE; + sat_engine_ret_call.permanentCallCtrlProblem = TAPI_SAT_CC_PROBLEM_NO_SPECIFIC_CAUSE; + break; + case CALL_VC_NETWORK_UNABLE_TO_PROCESS_COMMAND_WITHOUT_CAUSE: + sat_engine_ret_call.resp = TAPI_SAT_R_NETWORK_UNABLE_TO_PROCESS_COMMAND; + sat_engine_ret_call.bIsTapiCauseExist = FALSE; + sat_engine_ret_call.tapiCause = TAPI_CAUSE_UNKNOWN; + sat_engine_ret_call.meProblem = TAPI_SAT_ME_PROBLEM_NO_SPECIFIC_CAUSE; + sat_engine_ret_call.bIsOtherInfoExist = FALSE; + sat_engine_ret_call.permanentCallCtrlProblem = TAPI_SAT_CC_PROBLEM_NO_SPECIFIC_CAUSE; + break; + case CALL_VC_ME_CONTROL_PERMANENT_PROBLEM: + sat_engine_ret_call.resp = TAPI_SAT_R_INTRCTN_WITH_CC_OR_SMS_CTRL_PRMNT_PRBLM; + sat_engine_ret_call.bIsTapiCauseExist = FALSE; + sat_engine_ret_call.tapiCause = TAPI_CAUSE_UNKNOWN; + sat_engine_ret_call.meProblem = TAPI_SAT_ME_PROBLEM_ACCESS_CONTROL_CLASS_BAR; + sat_engine_ret_call.bIsOtherInfoExist = FALSE; + sat_engine_ret_call.permanentCallCtrlProblem = TAPI_SAT_CC_PROBLEM_ACTION_NOT_ALLOWED; + break; + case CALL_VC_ME_CLEAR_DOWN_BEFORE_CONN: + sat_engine_ret_call.resp = TAPI_SAT_R_USER_CLEAR_DOWN_CALL_BEFORE_CONN; + sat_engine_ret_call.bIsTapiCauseExist = FALSE; + sat_engine_ret_call.tapiCause = TAPI_CAUSE_UNKNOWN; + sat_engine_ret_call.meProblem = TAPI_SAT_ME_PROBLEM_ME_BUSY_ON_CALL; + sat_engine_ret_call.bIsOtherInfoExist = FALSE; + sat_engine_ret_call.permanentCallCtrlProblem = TAPI_SAT_CC_PROBLEM_NO_SPECIFIC_CAUSE; + break; + case CALL_VC_ME_RET_SUCCESS: + sat_engine_ret_call.resp = TAPI_SAT_R_SUCCESS; + sat_engine_ret_call.bIsTapiCauseExist = TRUE; + sat_engine_ret_call.tapiCause = TAPI_CAUSE_SUCCESS; + sat_engine_ret_call.meProblem = TAPI_SAT_ME_PROBLEM_NO_SPECIFIC_CAUSE; + sat_engine_ret_call.bIsOtherInfoExist = FALSE; + sat_engine_ret_call.permanentCallCtrlProblem = TAPI_SAT_CC_PROBLEM_NO_SPECIFIC_CAUSE; + break; + default: + return FALSE; + break; + } + call_vc_sat_response.commandType = TAPI_SAT_CMD_TYPE_SETUP_CALL; + call_vc_sat_response.commandId = pcall_vc_satcall_info->satengine_setupcall_data.commandId; + memset(&(call_vc_sat_response.appsRet.setupCall), 0, sizeof(call_vc_sat_response.appsRet.setupCall)); + memcpy(&(call_vc_sat_response.appsRet.setupCall), &sat_engine_ret_call, sizeof(call_vc_sat_response.appsRet.setupCall)); + } + break; + case SAT_RQST_SEND_DTMF: + { + TelSatDtmfRetInfo_t sat_engine_ret_dtmf; + switch (sat_response_type) { + case CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND: + sat_engine_ret_dtmf.resp = TAPI_SAT_R_ME_UNABLE_TO_PROCESS_COMMAND; + break; + case CALL_VC_NETWORK_UNABLE_TO_PROCESS_COMMAND: + sat_engine_ret_dtmf.resp = TAPI_SAT_R_NETWORK_UNABLE_TO_PROCESS_COMMAND; + break; + case CALL_VC_ME_CONTROL_PERMANENT_PROBLEM: + sat_engine_ret_dtmf.resp = TAPI_SAT_R_INTRCTN_WITH_CC_OR_SMS_CTRL_PRMNT_PRBLM; + break; + case CALL_VC_ME_CLEAR_DOWN_BEFORE_CONN: + sat_engine_ret_dtmf.resp = TAPI_SAT_R_USER_CLEAR_DOWN_CALL_BEFORE_CONN; + break; + case CALL_VC_ME_RET_SUCCESS: + sat_engine_ret_dtmf.resp = TAPI_SAT_R_SUCCESS; + break; + default: + return FALSE; + break; + } + call_vc_sat_response.commandType = TAPI_SAT_CMD_TYPE_SEND_DTMF; + call_vc_sat_response.commandId = pcall_vc_satcall_info->satengine_dtmf_data.commandId; + memset(&(call_vc_sat_response.appsRet.sendDtmf), 0, sizeof(call_vc_sat_response.appsRet.sendDtmf)); + memcpy(&(call_vc_sat_response.appsRet.sendDtmf), &sat_engine_ret_dtmf, sizeof(call_vc_sat_response.appsRet.sendDtmf)); + + /*Reset SAT DATA after sending response */ + pcall_vc_satcall_info->satengine_dtmf_data.bIsHiddenMode = FALSE; + CALL_ENG_DEBUG(ENG_ERR, "SAT Hidden mode has been reset"); + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Invalid SAT Rquest Response Type"); + break; + } + error_code = tel_send_sat_app_exec_result(&call_vc_sat_response); + if (error_code != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "Error tel_send_sat_app_exec_result():%#X", error_code); + return FALSE; + } + + else { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_send_sat_app_exec_result: Success"); + } + return TRUE; +} + +/** + * This function checks whether outgoing call is possible + * + * @return This function returns TRUE if outgoing call is possible or else FALSE + * @param[in] pagent Pointer to the call agent structure + * @param[in] bemergency_number TRUE - if outgoing call being made is emergency call or else FALSE + */ +gboolean _vc_core_ca_is_mocall_possible(call_vc_callagent_state_t *pagent, gboolean bemergency_number) +{ + gboolean bactive_call = FALSE; + gboolean bheld_call = FALSE; + int member_num = 0; + VOICECALL_RETURN_FALSE_IF_FAIL(pagent != NULL); + bactive_call = _vc_core_cm_isexists_active_call(&pagent->call_manager); + bheld_call = _vc_core_cm_isexists_held_call(&pagent->call_manager); + if (pagent->io_state != VC_INOUT_STATE_NONE) { + CALL_ENG_DEBUG(ENG_DEBUG, "io_state=%d with FALSE ..", pagent->io_state); + return FALSE; + } + + /* If it is emergency number, the call can be made by disconnecting all calls */ + if (bemergency_number) { + CALL_ENG_DEBUG(ENG_DEBUG, "Emergency number with TRUE.."); + return TRUE; + } + + /* Mo is impossile when both active and hold call exist */ + if (bactive_call && bheld_call) { + CALL_ENG_DEBUG(ENG_DEBUG, "ended with FALSE .."); + return FALSE; + } + + else { + member_num = _vc_core_cm_get_call_member_count(&pagent->call_manager); + +#ifdef _CPHS_DEFINED_ + if (bactive_call && _vc_core_svcall_cphs_csp_get_status(VC_CPHS_CSP_HOLD) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_svcall_cphs_csp_get_status : Hold is not possible"); + return FALSE; + } +#endif /* */ + /* Mo is impossile when member is more than max */ + if (member_num >= (VC_MAX_CALL_GROUP_MEMBER + 1)) { + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_ca_is_mocall_possible: ended with FALSE .."); + return FALSE; + } + + else { + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_ca_is_mocall_possible: ended with TRUE .."); + return TRUE; + } + } + return FALSE; +} + +/** + * This function ends all the active calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pagent Handle to voicecall engine + */ +gboolean _vc_core_ca_end_active_calls(call_vc_callagent_state_t *pagent) +{ + gboolean result = FALSE; + VOICECALL_RETURN_FALSE_IF_FAIL(pagent != NULL); + if (TRUE == _vc_core_cm_isexists_active_call(&pagent->call_manager)) { + result = _vc_core_tapi_rqst_release_active_calls(pagent); + if (TRUE == result) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_RELEASE_ALL_ACTIVECALL); + } + } + return result; +} + +/** + * This function ends all the calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pagent Handle to voicecall engine + */ +gboolean _vc_core_ca_end_all_calls(call_vc_callagent_state_t *pagent) +{ + gboolean result = FALSE; + VOICECALL_RETURN_FALSE_IF_FAIL(pagent != NULL); + result = _vc_core_tapi_rqst_release_all_calls(pagent); + if (TRUE == result) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS); + } + return result; +} + +/** + * This function ends all the held calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pagent Handle to voicecall engine + */ +gboolean _vc_core_ca_end_held_calls(call_vc_callagent_state_t *pagent) +{ + gboolean result = FALSE; + VOICECALL_RETURN_FALSE_IF_FAIL(pagent != NULL); + if (TRUE == _vc_core_cm_isexists_held_call(&pagent->call_manager)) { + result = _vc_core_tapi_rqst_release_held_calls(pagent); + if (TRUE == result) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_RELEASE_ALL_HOLDCALL); + } + } + return result; +} + +/** + * This function checks whether private call is possible or not + * + * @return This function returns TRUE if private is possible or else FALSE + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_ca_is_private_call_possible(call_vc_callagent_state_t *pcall_agent) +{ + gboolean active_calls = FALSE, held_calls = FALSE; + int active_call_member = 0; + _vc_core_cm_isexists_call_ingroup(&pcall_agent->call_manager, &active_calls, &held_calls); + active_call_member = _vc_core_cm_get_active_call_count(&pcall_agent->call_manager); + if (TRUE == active_calls && FALSE == held_calls) { + if (active_call_member > 1) { + return TRUE; + } + } + return FALSE; +} + +/** + * This function checks whether call transfer is possible + * + * @return This function returns TRUE if transfer is possible or else FALSE + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_ca_is_transfer_call_possible(call_vc_callagent_state_t *pcall_agent) +{ + gboolean active_calls = FALSE; + gboolean held_calls = FALSE; + int total_call_member = 0; + +#ifdef _CPHS_DEFINED_ + if (FALSE == _vc_core_svcall_cphs_csp_get_status(pcall_agent, VC_CPHS_CSP_CT)) { + return FALSE; + } +#endif /* */ + _vc_core_cm_isexists_call_ingroup(&pcall_agent->call_manager, &active_calls, &held_calls); + total_call_member = _vc_core_cm_get_call_member_count(&pcall_agent->call_manager); + + /* The Explicit Call Transfer (ECT) function should be invoked in association with two existing calls which 1) one is answered and in the held state and 2) the other is answered and active or alerting. */ + if (3 == total_call_member) { + if ((TRUE == active_calls) && (TRUE == held_calls) && (VC_INVALID_CALL_INDEX != pcall_agent->call_manager.mtcall_index)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Transfer possible..1 active, 1 held, 1 waiting.."); + return TRUE; + } + } + + else if (2 == total_call_member) { + if ((TRUE == active_calls) && (TRUE == held_calls) && (VC_INVALID_CALL_INDEX == pcall_agent->call_manager.mtcall_index)) { + return TRUE; + } + + else if ((FALSE == active_calls) && (TRUE == held_calls) && (VC_INVALID_CALL_INDEX != pcall_agent->call_manager.mtcall_index)) { + return TRUE; + } + + else if ((FALSE == active_calls) && (TRUE == held_calls) && (-1 != pcall_agent->call_manager.setupcall_info.mocall_index) /*Outgoing call exists */ + && (VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED == pcall_agent->io_state)) { + return TRUE; + } + } + return FALSE; +} + +/** + * This function checks whether conference call is possible + * + * @return This function returns TRUE if transfer is possible or else FALSE + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_ca_is_conf_call_possible(call_vc_callagent_state_t *pcall_agent) +{ + gboolean active_calls = FALSE; + gboolean held_calls = FALSE; + int total_call_member = 0; + +#ifdef _CPHS_DEFINED_ + if (FALSE == _vc_core_svcall_cphs_csp_get_status(pcall_agent, VC_CPHS_CSP_MPTY)) { + return FALSE; + } +#endif /* */ + _vc_core_cm_isexists_call_ingroup(&pcall_agent->call_manager, &active_calls, &held_calls); + total_call_member = _vc_core_cm_get_call_member_count(&pcall_agent->call_manager); + + /* Joining call is impossile when active or hold call doesn't exist */ + if ((FALSE == active_calls) || (FALSE == held_calls)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Join Impossible..."); + return FALSE; + } + + else { + + /*Joining call is impossile when member is more than max + * if ( total_call_member >= (CALL_VC_CALL_GROUP_MEMBER_MAX + 1)) : Max Number in Group + Another Call*/ + if (total_call_member > VC_MAX_CALL_GROUP_MEMBER) { /*Logic Changed from above line for same condition */ + CALL_ENG_DEBUG(ENG_DEBUG, "Ended with FALSE..."); + return FALSE; + } + + else { + CALL_ENG_DEBUG(ENG_DEBUG, "Ended with TRUE..."); + return TRUE; + } + } + return FALSE; +} + +/** + * This function clears the data of a connected call givenits call handle + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Handle to voicecall engine + * @param[in] call_handle Call handle of the connected call to be cleared + */ +gboolean _vc_core_ca_clear_connected_call(call_vc_callagent_state_t *pcall_agent, int call_handle) +{ + call_vc_call_objectinfo_t call_object; + gboolean remove = FALSE; + int group_index = -1; + int grp_mem_num = 0; + int i = 0; + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(call_handle >= 0); + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &call_object); + group_index = _vc_core_cm_get_group_index(&pcall_agent->call_manager, (call_vc_handle) call_handle); + if (group_index == -1) { + CALL_ENG_DEBUG(ENG_DEBUG, "ERROR: Not exist"); + return FALSE; + } + grp_mem_num = _vc_core_cm_get_member_count_ingroup(&pcall_agent->call_manager, group_index); + for (i = 0; i < grp_mem_num; i++) { + if ((_vc_core_cm_get_call_state_ingroup_byposition(&pcall_agent->call_manager, group_index, i) != VC_CALL_STATE_ENDED) && (_vc_core_cm_get_call_state_ingroup_byposition(&pcall_agent->call_manager, group_index, i) != VC_CALL_STATE_ENDED_FINISH)) { + remove = TRUE; + } + } + if (remove) { + _vc_core_cm_remove_call_object(&pcall_agent->call_manager, call_handle); + } + + else { + gboolean clear_end_call = TRUE; + _vc_core_cm_change_call_state(&call_object, VC_CALL_STATE_ENDED_FINISH); + _vc_core_cm_set_call_object(&pcall_agent->call_manager, &call_object); + for (i = 0; i < grp_mem_num; i++) { + if (_vc_core_cm_get_call_state_ingroup_byposition(&pcall_agent->call_manager, group_index, i) != VC_CALL_STATE_ENDED_FINISH) + clear_end_call = FALSE; + } + if (clear_end_call) { + _vc_core_cm_clear_endcall_member(&pcall_agent->call_manager); + } + } + return TRUE; +} diff --git a/call-engine/core/vc-core-callmanager.c b/call-engine/core/vc-core-callmanager.c new file mode 100755 index 0000000..806899e --- /dev/null +++ b/call-engine/core/vc-core-callmanager.c @@ -0,0 +1,1913 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include +#include +#include "vc-core-util.h" +#include "vc-core-callmanager.h" +#include "vc-core-callagent.h" + +char *gaszCallStateName[VC_CALL_STATE_MAX_NUM] = { + "CALL_NONE", + "CALL_INCOME", + "CALL_REJECTED", + "CALL_PREPARE_OUTGOING", + "CALL_OUTGOING", + "CALL_OUTGOING_ORIG", + "CALL_OUTGOING_ALERT", + "CALL_CANCELLED", + "CALL_CONNECTED", + "CALL_RELEASE_WAIT", + "CALL_ENDED", + "CALL_REDIAL", + "CALL_ENDED_FINISH", +}; + +/*Local Function Declarations*/ +/** +* This function handles sat engine notification +* +* @internal +* @return Returns TRUE on success or FALSE on failure +* @param[in] callStatusInfo Handle to call manager +* @param[in] call_handle telephony call handle +* @param[out] pGroup group to which the call_handle belongs +* @param[in] pPos positoin in the pGroup in which the call details of call handle is maintained +*/ +static gboolean __call_vc_cm_gp_get_groupcall_pos(call_vc_manager_t *callStatusInfo, call_vc_handle call_handle, int *pGroup, int *pPos); + +/** + * This function removes a call member to a group + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] call_handle The call handle to be removed + * @see _vc_core_cm_add_call_member_togroup + */ +static gboolean __vc_core_cm_remove_call_member_fromgroup(call_vc_manager_t *pMng, call_vc_handle call_handle); + +/*Function Definitions*/ +/** + * This function initializes the call manager + * + * @return void + * @param[out] pMng Pointer to the call manager structure + */ +void _vc_core_call_manager_init(call_vc_manager_t *pMng) +{ + VOICECALL_RETURN_IF_FAIL(pMng != NULL); + int index = 0; + + memset(pMng, 0, sizeof(call_vc_manager_t)); + + /* init call handle */ + for (index = 0; index < VC_MAX_CALL_MEMBER; index++) { + /*CALL_ENG_DEBUG(ENG_DEBUG, "%d",index);*/ + pMng->callobject_info[index].call_handle = VC_TAPI_INVALID_CALLHANDLE; + pMng->callobject_info[index].aoc_ccm = VC_INVALID_CALL_COST; + pMng->callobject_info[index].call_id = VC_INVALID_CALL_ID; + pMng->callobject_info[index].call_type = VC_CALL_ORIG_TYPE_NORMAL; + } + + pMng->setupcall_info.mocall_index = VC_INVALID_CALL_INDEX; + pMng->setupcall_info.call_control_type = CALL_VC_SAT_CC_NONE; + pMng->mtcall_index = VC_INVALID_CALL_INDEX; + + CALL_ENG_DEBUG(ENG_DEBUG, "[pMng->callobject_info initialized]"); + +} + +/** + * This function clears the information of a given call state + * + * @return void + * @param[in] pcall_object Pointer to the call object which has to be cleared + */ +void _vc_core_cm_clear_call_object(call_vc_call_objectinfo_t *pcall_object) +{ + VOICECALL_RETURN_IF_FAIL(pcall_object != NULL); + memset(pcall_object, 0, sizeof(call_vc_call_objectinfo_t)); + + pcall_object->state = VC_CALL_STATE_NONE; + pcall_object->call_handle = VC_TAPI_INVALID_CALLHANDLE; + pcall_object->aoc_ccm = VC_INVALID_CALL_COST; + pcall_object->call_id = VC_INVALID_CALL_ID; + pcall_object->call_type = VC_CALL_ORIG_TYPE_NORMAL; + +#ifdef _CPHS_DEFINED_ + pcall_object->alsLine = VC_CALL_CPHS_ALS_NONE; +#endif + + pcall_object->bccbs_call = FALSE; + +} + +/** +* This function clears the information of the callobject available in the given index + * +* @return TRUE, if the object cleared, otherwise FALSE +* @param[in] pMng Pointer to the call manager structure +* @param[in] index Index of the call object to be cleared + */ +gboolean _vc_core_cm_clear_call_object_byindex(call_vc_manager_t *pMng, int index) +{ + call_vc_call_objectinfo_t call_object; + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(index >= 0 && index <= 7); + + if (TRUE == _vc_core_cm_get_call_object_byindex(pMng, index, &call_object)) { + _vc_core_cm_clear_call_object(&call_object); + return TRUE; + } + + return FALSE; +} + +/** + * This function adds the given call object info to a free slot. + * + * @return This function returns the call object index on success and -1 on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] pcall_object Pointer to the call object info structure that need to be added + * @see _vc_core_cm_set_call_object, _vc_core_cm_remove_call_object + */ +int _vc_core_cm_add_call_object(call_vc_manager_t *pMng, call_vc_call_objectinfo_t *pcall_object) +{ + int index = 0; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_INVALID_IF_FAIL(pcall_object != NULL); + + for (index = 0; index < VC_MAX_CALL_MEMBER; index++) { + if (pMng->callobject_info[index].state == VC_CALL_STATE_NONE) { + memcpy(&pMng->callobject_info[index], pcall_object, sizeof(call_vc_call_objectinfo_t)); + return index; + } + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Insufficient buffer i = %d..", index); + + return VC_TAPI_INVALID_CALLHANDLE; +} + +/** + * This function removes the specified call object info of a given call handle + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] call_handle Handle of the call object to be removed + * @see _vc_core_cm_add_call_object, _vc_core_cm_set_call_object + */ +gboolean _vc_core_cm_remove_call_object(call_vc_manager_t *pMng, call_vc_handle call_handle) +{ + int i = 0; + int groupIndex = -1; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(call_handle != VC_TAPI_INVALID_CALLHANDLE); + + CALL_ENG_DEBUG(ENG_DEBUG, "[Call Handle = %d]", call_handle); + + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if (pMng->callobject_info[i].call_handle == call_handle) { + if (pMng->setupcall_info.mocall_index == i) { + CALL_ENG_DEBUG(ENG_DEBUG, "Removing MO Call Info >> i=%d", i); + pMng->setupcall_info.mocall_index = VC_INVALID_CALL_INDEX; + pMng->setupcall_info.no_service_state = FALSE; + } else if (pMng->mtcall_index == i) { + CALL_ENG_DEBUG(ENG_DEBUG, "Removing MT Call Info >> i=%d", i); + pMng->mtcall_index = VC_INVALID_CALL_INDEX; + } else { + groupIndex = _vc_core_cm_get_group_index(pMng, call_handle); + __vc_core_cm_remove_call_member_fromgroup(pMng, call_handle); + } + _vc_core_cm_clear_call_object(&(pMng->callobject_info[i])); + break; + } + + } + + return TRUE; +} + +/** + * This function retrieves the given call object info + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] call_handle Call handle of the object info to be retrieved + * @param[out] pcall_object Pointer to the call object info structure that should be retrieved + * @see _vc_core_cm_add_call_object, _vc_core_cm_remove_call_object, _vc_core_cm_set_call_object + */ +gboolean _vc_core_cm_get_call_object(call_vc_manager_t *pMng, call_vc_handle call_handle, call_vc_call_objectinfo_t *pcall_object) +{ + int i = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(call_handle != VC_TAPI_INVALID_CALLHANDLE); + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_object != NULL); + + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if (pMng->callobject_info[i].call_handle == call_handle) { + memcpy(pcall_object, &pMng->callobject_info[i], sizeof(call_vc_call_objectinfo_t)); + return TRUE; + } + } + + return FALSE; +} + +/** + * This function retrieves the given call object info + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] index index of the object info to be retrieved + * @param[out] pcall_object Pointer to the call object info structure that should be retrieved + * @see _vc_core_cm_add_call_object, _vc_core_cm_remove_call_object, _vc_core_cm_set_call_object + */ +gboolean _vc_core_cm_get_call_object_byindex(call_vc_manager_t *pMng, int index, call_vc_call_objectinfo_t *pcall_object) +{ + int i = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(index >= 0 && index <= 7); + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_object != NULL); + + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if (i == index) { + memcpy(pcall_object, &pMng->callobject_info[i], sizeof(call_vc_call_objectinfo_t)); + return TRUE; + } + } + + return FALSE; +} + +/** + * This function retrieves the call state of a given call handle + * + * @return This function returns the call state + * @param[in] pMng Pointer to the call manager structure + * @param[in] call_handle Call handle for which the state has to be retrieved + */ +voicecall_call_state_t _vc_core_cm_get_call_state(call_vc_manager_t *pMng, call_vc_handle call_handle) +{ + int i = 0; + + VOICECALL_RETURN_VALUE_IF_FAIL(pMng != NULL, VC_CALL_STATE_NONE); + VOICECALL_RETURN_VALUE_IF_FAIL(call_handle != VC_TAPI_INVALID_CALLHANDLE, VC_CALL_STATE_NONE); + + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if (pMng->callobject_info[i].call_handle == call_handle) { + return pMng->callobject_info[i].state; + } + } + + return VC_CALL_STATE_NONE; +} + + /** + * This function retrieves the number of call members in various states of a call + * + * @return Number of call members available + * @param[in] pMng Pointer to the call manager structure + */ +int _vc_core_cm_get_call_member_count(call_vc_manager_t *pMng) +{ + int i = 0; + int nCount = 0; + + VOICECALL_RETURN_ZERO_IF_FAIL(pMng != NULL); + + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if (pMng->callobject_info[i].state != VC_CALL_STATE_NONE) + nCount++; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "%d", nCount); + + return nCount; +} + +/** + * This function sets the given call object info to the given slot + * + * @return This function returns the call object index on success and -1 on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] pcall_object Pointer to the call object info structure that need to be modified + * @see _vc_core_cm_add_call_object, _vc_core_cm_remove_call_object, _vc_core_cm_get_call_object + */ +int _vc_core_cm_set_call_object(call_vc_manager_t *pMng, call_vc_call_objectinfo_t *pcall_object) +{ + int i = 0; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_INVALID_IF_FAIL(pcall_object != NULL); + + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if (pMng->callobject_info[i].call_handle == pcall_object->call_handle) { + CALL_ENG_DEBUG(ENG_DEBUG, "[Call Handle = %d]", pcall_object->call_handle); + memcpy(&pMng->callobject_info[i], pcall_object, sizeof(call_vc_call_objectinfo_t)); + return i; + } + } + + return VC_TAPI_INVALID_CALLHANDLE; +} + +/** + * This function returns the number of calls in a given call state + * + * @return This function returns the number of calls in the given state + * @param[in] pMng Pointer to the call manager structure + * @param[in] state The call state the number of which has to be retrieved + */ +int _vc_core_cm_get_call_state_num(call_vc_manager_t *pMng, voicecall_call_state_t state) +{ + int i = 0; + int count = 0; + + VOICECALL_RETURN_ZERO_IF_FAIL(pMng != NULL); + + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if (pMng->callobject_info[i].state == state) { + count++; + } + } + return count; +} + +static gboolean __call_vc_cm_gp_get_groupcall_pos(call_vc_manager_t *callStatusInfo, call_vc_handle call_handle, int *pGroup, int *pPos) +{ + int group = 0; + int pos = 0; + gboolean bFound = FALSE; + call_vc_groupinfo_t *pcall_group_info = NULL; + call_vc_call_objectinfo_t *pcall_object_info = NULL; + + VOICECALL_RETURN_FALSE_IF_FAIL(callStatusInfo != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(call_handle != VC_TAPI_INVALID_CALLHANDLE); + VOICECALL_RETURN_FALSE_IF_FAIL(pGroup != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(pPos != NULL); + + /*Optimization: Avoiding Long dereferencing inside loops */ + pcall_group_info = callStatusInfo->callgroup_info; + pcall_object_info = callStatusInfo->callobject_info; + for (group = 0; group < CALL_VC_CALL_GROUP_MAX; group++) { + CALL_ENG_DEBUG(ENG_DEBUG, "callStatusInfo->callgroup_info[%d].num:%d", group, callStatusInfo->callgroup_info[group].num); + for (pos = 0; pos < pcall_group_info[group].num; pos++) { + int v = pcall_group_info[group].callobject_index[pos]; + if (pcall_object_info[v].call_handle == call_handle) { + bFound = TRUE; + break; + } + } + if (bFound) + break; + } + + if (bFound == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "fail to get"); + return FALSE; + } + + *pGroup = group; + *pPos = pos; + + return TRUE; + +} + +/** + * This function adds a call member to a group + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] callobject_index The object index of the call object to be added + * @see __vc_core_cm_remove_call_member_fromgroup + */ +gboolean _vc_core_cm_add_call_member_togroup(call_vc_manager_t *pMng, int callobject_index) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(pMng->callgroup_info[CALL_VC_CALL_GROUP_1].state == CALL_VC_GROUP_STATE_NONE); + + CALL_ENG_DEBUG(ENG_DEBUG, "member index=%d", callobject_index); + + /* Every Member should be added to a new group when added for the first time. First check whether Group 0 has any members. + If Group 0 has any previous members then move all members in the Group 0 to Group 1 and Group 0 must be in held state + as the current call is going to be active in the new group. Then add this new call to the Group 0 and Group 0 becomes active group */ + if (pMng->callgroup_info[CALL_VC_CALL_GROUP_0].state != CALL_VC_GROUP_STATE_NONE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Copying Group 0 data to Group 1"); + VOICECALL_RETURN_FALSE_IF_FAIL(pMng->callgroup_info[CALL_VC_CALL_GROUP_0].state == CALL_VC_GROUP_STATE_HOLD); + memcpy(&(pMng->callgroup_info[CALL_VC_CALL_GROUP_1]), &(pMng->callgroup_info[CALL_VC_CALL_GROUP_0]), sizeof(call_vc_groupinfo_t)); + } + + pMng->callgroup_info[CALL_VC_CALL_GROUP_0].num = 1; + pMng->callgroup_info[CALL_VC_CALL_GROUP_0].callobject_index[0] = callobject_index; + pMng->callgroup_info[CALL_VC_CALL_GROUP_0].state = CALL_VC_GROUP_STATE_ACTIVE; + + /*If the currently added call is Incoming or Outgoing call then make the Incoming/Outgoing status + invalid since the call has been connected and added to call group */ + if (callobject_index == pMng->setupcall_info.mocall_index) { + pMng->setupcall_info.mocall_index = VC_INVALID_CALL_INDEX; + pMng->setupcall_info.no_service_state = FALSE; + } else if (callobject_index == pMng->mtcall_index) { + pMng->mtcall_index = VC_INVALID_CALL_INDEX; + } else { + return FALSE; + } + + return TRUE; + +} + +/** + * This function removes a call member to a group + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] call_handle The call handle to be removed + * @see _vc_core_cm_add_call_member_togroup + */ +gboolean __vc_core_cm_remove_call_member_fromgroup(call_vc_manager_t *pMng, call_vc_handle call_handle) +{ + int group = 0; + int pos = 0; + int i = 0; + call_vc_groupinfo_t *pcall_group_info = NULL; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(call_handle != VC_TAPI_INVALID_CALLHANDLE); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d", call_handle); + + /*Findout the Index Group number and the index posistion in the group for the given call handle */ + if (__call_vc_cm_gp_get_groupcall_pos(pMng, call_handle, &group, &pos) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "fail to remove"); + return FALSE; + } + + /*Optimization: Avoiding Long dereferencing inside loops */ + pcall_group_info = pMng->callgroup_info; + for (i = pos + 1; i < pMng->callgroup_info[group].num; i++) { + pcall_group_info[group].callobject_index[i - 1] = pcall_group_info[group].callobject_index[i]; + } + + pcall_group_info[group].num--; + + /*If the number of members in the group become 0, then make the group status to none */ + if (pcall_group_info[group].num == 0) { + pcall_group_info[group].state = CALL_VC_GROUP_STATE_NONE; + + /*If Group 0 becomes none and Group 1 has any members , then move the Group 1 members to Group 0 + Always the Group 0 is prefered group by default, this logic is to simplify all other search mehods. */ + if ((group == 0) && (pcall_group_info[CALL_VC_CALL_GROUP_1].num > 0)) { + memcpy(&(pcall_group_info[0]), &(pcall_group_info[1]), sizeof(call_vc_groupinfo_t)); + memset(&(pcall_group_info[1]), 0, sizeof(call_vc_groupinfo_t)); + } + } + + return TRUE; + +} + +/** + * This function clears the call object information of the ended and finished calls + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + */ +gboolean _vc_core_cm_clear_endcall_member(call_vc_manager_t *pMng) +{ + int i = 0; + call_vc_call_objectinfo_t *pcall_object_info = NULL; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "..."); + + /*Optimization: Avoiding Long dereferencing inside loops */ + pcall_object_info = pMng->callobject_info; + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if ((pcall_object_info[i].state == VC_CALL_STATE_ENDED) || (pcall_object_info[i].state == VC_CALL_STATE_ENDED_FINISH)) { + __vc_core_cm_remove_call_member_fromgroup(pMng, pcall_object_info[i].call_handle); + + _vc_core_cm_clear_call_object(&pcall_object_info[i]); + } + } + return TRUE; +} + +/** + * This function sets the state of a given group + * + * @return void + * @param[in] pMng Pointer to the call manager structure + * @param[in] nGroup The call group for which the state needs to be changed + * @param[in] state The state to be set + * @see _vc_core_cm_swap_group_state, _vc_core_cm_get_call_pos_ingroup + */ +void _vc_core_cm_set_group_state(call_vc_manager_t *pMng, int nGroup, call_vc_groupstate_t state) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "group=%d, state=%d", nGroup, state); + + VOICECALL_RETURN_IF_FAIL(pMng != NULL); + /*Only Group 0 and Group 1 are possible */ + VOICECALL_RETURN_IF_FAIL((nGroup >= CALL_VC_CALL_GROUP_0 && nGroup < CALL_VC_CALL_GROUP_MAX)); + + pMng->callgroup_info[nGroup].state = state; +} + +/** + * This function retrieves the index of the group given the call handle + * + * @return Returns group index on success and -1 on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] call_handle The for which the group index has to be retrieved + * @see _vc_core_cm_set_group_state, _vc_core_cm_get_call_pos_ingroup + */ +int _vc_core_cm_get_group_index(call_vc_manager_t *pMng, call_vc_handle call_handle) +{ + int group = 0; + int index = 0; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_INVALID_IF_FAIL(call_handle != VC_TAPI_INVALID_CALLHANDLE); + + if (__call_vc_cm_gp_get_groupcall_pos(pMng, call_handle, &group, &index) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "fail"); + return VC_TAPI_INVALID_CALLHANDLE; + } + + return group; +} + +/** + * This function retrieves the index/position of the call info in the object info table for a given call handle + * + * @return Returns index on success and -1 on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] nGroup Group ID + * @param[in] call_handle The call handle for which the call index has to be retrieved + * @see _vc_core_cm_get_group_index + */ +int _vc_core_cm_get_call_pos_ingroup(call_vc_manager_t *pMng, int nGroup, call_vc_handle call_handle) +{ + int i = 0; + int idx = 0; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_INVALID_IF_FAIL((nGroup >= CALL_VC_CALL_GROUP_0 && nGroup < CALL_VC_CALL_GROUP_MAX)); + VOICECALL_RETURN_INVALID_IF_FAIL(call_handle != VC_TAPI_INVALID_CALLHANDLE); + + for (i = 0; i < pMng->callgroup_info[nGroup].num; i++) { + idx = pMng->callgroup_info[nGroup].callobject_index[i]; + if (pMng->callobject_info[idx].call_handle == call_handle) + return i; + } + return VC_TAPI_INVALID_CALLHANDLE; +} + +/** + * This function swaps the state of the groups + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_set_group_state + */ +gboolean _vc_core_cm_swap_group_state(call_vc_manager_t *pMng) +{ + int i = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_HOLD) + pMng->callgroup_info[i].state = CALL_VC_GROUP_STATE_ACTIVE; + else if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_ACTIVE) + pMng->callgroup_info[i].state = CALL_VC_GROUP_STATE_HOLD; + } + return TRUE; +} + +/** + * This function joins the groups + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_split_group + */ +gboolean _vc_core_cm_join_group(call_vc_manager_t *pMng) +{ + int callIndex[VC_MAX_CALL_MEMBER]; + int i = 0; + int j = 0; + int nCount = 0; + int totalMember = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + totalMember = _vc_core_cm_get_total_members_ingroup(pMng); + + CALL_ENG_DEBUG(ENG_DEBUG, "Total Members: %d", totalMember); + + for (i = CALL_VC_CALL_GROUP_MAX - 1; i >= 0; i--) { + for (j = 0; j < pMng->callgroup_info[i].num; j++) { + callIndex[nCount] = pMng->callgroup_info[i].callobject_index[j]; + nCount++; + } + } + + VOICECALL_RETURN_FALSE_IF_FAIL(nCount <= VC_MAX_CALL_GROUP_MEMBER); + + for (i = 0; i < nCount; i++) { + pMng->callgroup_info[CALL_VC_CALL_GROUP_0].callobject_index[i] = callIndex[i]; + } + + pMng->callgroup_info[CALL_VC_CALL_GROUP_0].num = nCount; + if (nCount == 0) + pMng->callgroup_info[CALL_VC_CALL_GROUP_0].state = CALL_VC_GROUP_STATE_NONE; + else + pMng->callgroup_info[CALL_VC_CALL_GROUP_0].state = CALL_VC_GROUP_STATE_ACTIVE; + + pMng->callgroup_info[CALL_VC_CALL_GROUP_1].num = 0; + pMng->callgroup_info[CALL_VC_CALL_GROUP_1].state = CALL_VC_GROUP_STATE_NONE; + + return TRUE; + +} + +/** + * This function splits the group given a call handle + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] call_handle Call handle + * @see _vc_core_cm_join_group + */ +gboolean _vc_core_cm_split_group(call_vc_manager_t *pMng, call_vc_handle call_handle) +{ + int group = 0; + int pos = 0; + int i = 0; + int count = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(call_handle != VC_TAPI_INVALID_CALLHANDLE); + + if (__call_vc_cm_gp_get_groupcall_pos(pMng, call_handle, &group, &pos) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "fail"); + return FALSE; + } + + VOICECALL_RETURN_FALSE_IF_FAIL(group == 0); + VOICECALL_RETURN_FALSE_IF_FAIL(pMng->callgroup_info[CALL_VC_CALL_GROUP_1].state == CALL_VC_GROUP_STATE_NONE); + + CALL_ENG_DEBUG(ENG_DEBUG, "group=%d, pos=%d, Call Handle = %d, title=%s", group, pos, call_handle, pMng->callobject_info[pMng->callgroup_info[group].callobject_index[pos]].tel_number); + + for (i = 0; i < pMng->callgroup_info[0].num; i++) { + if (i != pos) { + pMng->callgroup_info[CALL_VC_CALL_GROUP_1].callobject_index[count] = pMng->callgroup_info[CALL_VC_CALL_GROUP_0].callobject_index[i]; + count++; + } + } + + pMng->callgroup_info[CALL_VC_CALL_GROUP_1].num = count; + + if (count == 0) + pMng->callgroup_info[CALL_VC_CALL_GROUP_1].state = CALL_VC_GROUP_STATE_NONE; + else + pMng->callgroup_info[CALL_VC_CALL_GROUP_1].state = CALL_VC_GROUP_STATE_HOLD; + + pMng->callgroup_info[CALL_VC_CALL_GROUP_0].num = 1; + pMng->callgroup_info[CALL_VC_CALL_GROUP_0].state = CALL_VC_GROUP_STATE_ACTIVE; + pMng->callgroup_info[CALL_VC_CALL_GROUP_0].callobject_index[0] = pMng->callgroup_info[CALL_VC_CALL_GROUP_0].callobject_index[pos]; + + return TRUE; + +} + +/** + * This function retreives the group state for the given group index + * + * @return This function returns the group state + * @param[in] pMng Pointer to the call manager structure + * @param[in] nGroup group index + */ +call_vc_groupstate_t _vc_core_cm_get_group_state(call_vc_manager_t *pMng, int nGroup) +{ + VOICECALL_RETURN_VALUE_IF_FAIL(pMng != NULL, CALL_VC_GROUP_STATE_NONE); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(nGroup, 0, 1, CALL_VC_GROUP_STATE_NONE); + + return pMng->callgroup_info[nGroup].state; +} + +/** + * This function retrieves the number of members in a group + * + * @return Returns number of members in the group + * @param[in] pMng Pointer to the call manager structure + * @param[in] nGroup Group index + */ +int _vc_core_cm_get_member_count_ingroup(call_vc_manager_t *pMng, int nGroup) +{ + VOICECALL_RETURN_ZERO_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(nGroup, 0, 1, CALL_VC_GROUP_STATE_NONE); + + return pMng->callgroup_info[nGroup].num; +} + +/** + * This function retrieves the total number of members in all the groups + * + * @return Returns the total number of members + * @param[in] pMng Pointer to the call manager structure + */ +int _vc_core_cm_get_total_members_ingroup(call_vc_manager_t *pMng) +{ + VOICECALL_RETURN_ZERO_IF_FAIL(pMng != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "Members in Group 0: %d, Members in Group 1: %d", pMng->callgroup_info[CALL_VC_CALL_GROUP_0].num, pMng->callgroup_info[CALL_VC_CALL_GROUP_1].num); + return (pMng->callgroup_info[CALL_VC_CALL_GROUP_0].num + pMng->callgroup_info[CALL_VC_CALL_GROUP_1].num); +} + +/** + * This function retrieves the number of connected members in a group + * + * @return Returns number of connected members in the group + * @param[in] pMng Pointer to the call manager structure + * @param[in] nGroup Group index + */ +int _vc_core_cm_get_connected_member_count_ingroup(call_vc_manager_t *pMng, int nGroup) +{ + int i = 0; + int callIndex = 0; + int count = 0; + + VOICECALL_RETURN_ZERO_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(nGroup, 0, 1, CALL_VC_GROUP_STATE_NONE); + + for (i = 0; i < pMng->callgroup_info[nGroup].num; i++) { + callIndex = pMng->callgroup_info[nGroup].callobject_index[i]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + count++; + } + } + return count; + +} + +/** + * This function retrieves the total number of groups + * + * @return Returns the total number of groups + * @param[in] pMng Pointer to the call manager structure + */ +int _vc_core_cm_get_group_count(call_vc_manager_t *pMng) +{ + int num = 0; + int i = 0; + + VOICECALL_RETURN_ZERO_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + CALL_ENG_DEBUG(ENG_DEBUG, "pMng->callgroup_info[%d].num = %d", i, pMng->callgroup_info[i].num); + + if (pMng->callgroup_info[i].num != 0) + num++; + } + return num; +} + +/** + * This function retrieves the call state of a given group and object position + * + * @return Returns call state of the object + * @param[in] pMng Pointer to the call manager structure + * @param[in] nGroup Group index + * @param[in] nPos Call object index + */ +voicecall_call_state_t _vc_core_cm_get_call_state_ingroup_byposition(call_vc_manager_t *pMng, int nGroup, int nPos) +{ + int memIndex = 0; + + VOICECALL_RETURN_VALUE_IF_FAIL(pMng != NULL, VC_CALL_STATE_NONE); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(nGroup, 0, 1, VC_CALL_STATE_NONE); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(nPos, 0, 4, VC_CALL_STATE_NONE); + + if (pMng->callgroup_info[nGroup].state == CALL_VC_GROUP_STATE_NONE) { + return VC_CALL_STATE_NONE; + } + + if (nPos >= pMng->callgroup_info[nGroup].num) { + return VC_CALL_STATE_NONE; + } + + memIndex = pMng->callgroup_info[nGroup].callobject_index[nPos]; + + return pMng->callobject_info[memIndex].state; +} + +/** + * This function retrieves the call object info of a given group and object position + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] nGroup Group index + * @param[in] nPos Call object index + * @param[out] pcall_object Pointer to the call object info structure + */ +gboolean _vc_core_cm_get_call_info_ingroup_byposition(call_vc_manager_t *pMng, int nGroup, int nPos, call_vc_call_objectinfo_t *pcall_object) +{ + int memIndex = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(nGroup, 0, 1, FALSE); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(nPos, 0, 4, FALSE); + + if (pMng->callgroup_info[nGroup].state == CALL_VC_GROUP_STATE_NONE) + return FALSE; + if (nPos >= pMng->callgroup_info[nGroup].num) + return FALSE; + + memIndex = pMng->callgroup_info[nGroup].callobject_index[nPos]; + + memcpy(pcall_object, &pMng->callobject_info[memIndex], sizeof(call_vc_call_objectinfo_t)); + + return TRUE; +} + +/** + * This function checks if connected call exists + * + * @return Returns TRUE if call exist FALSE otherwise + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_isexits_outgoing_call, _vc_core_cm_isexists_incoming_call + */ +gboolean _vc_core_cm_isexists_connected_call(call_vc_manager_t *pMng) +{ + int i = 0; + int group = 0; + int callIndex = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + for (group = 0; group < CALL_VC_CALL_GROUP_MAX; group++) { + for (i = 0; i < pMng->callgroup_info[group].num; i++) { + callIndex = pMng->callgroup_info[group].callobject_index[i]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + return TRUE; + } + } + } + return FALSE; + +} + +/** + * This function retrieves the group state for a given call ID of an + * + * @return This function returns the group state + * @param[in] pMng Pointer to the call manager structure + * @param[in] callID The call ID of the object + */ +call_vc_groupstate_t _vc_core_cm_get_group_state_callid(call_vc_manager_t *pMng, int callID) +{ + int i = 0; + int nGroup = 0; + int callIndex = 0; + + VOICECALL_RETURN_VALUE_IF_FAIL(pMng != NULL, CALL_VC_GROUP_STATE_NONE); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(callID, 1, 7, FALSE); + + for (nGroup = 0; nGroup < CALL_VC_CALL_GROUP_MAX; nGroup++) { + if (pMng->callgroup_info[nGroup].state == CALL_VC_GROUP_STATE_NONE) + continue; + + for (i = 0; i < pMng->callgroup_info[nGroup].num; i++) { + callIndex = pMng->callgroup_info[nGroup].callobject_index[i]; + if (pMng->callobject_info[callIndex].call_id == callID) { + return pMng->callgroup_info[nGroup].state; + } + } + } + + return CALL_VC_GROUP_STATE_NONE; + +} + +/** + * This function clears the outgoing call information + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_set_outgoing_call + */ +gboolean _vc_core_cm_clear_outgoing_call(call_vc_manager_t *pMng) +{ + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + if (pMng->setupcall_info.mocall_index != VC_INVALID_CALL_INDEX) { + _vc_core_cm_clear_call_object(&(pMng->callobject_info[pMng->setupcall_info.mocall_index])); + pMng->setupcall_info.mocall_index = VC_INVALID_CALL_INDEX; + pMng->setupcall_info.no_service_state = FALSE; + pMng->setupcall_info.call_control_type = CALL_VC_SAT_CC_NONE; + + CALL_ENG_DEBUG(ENG_DEBUG, "remove outgoing call info"); + return TRUE; + } + return FALSE; +} + +/** + * This function sets the out going call index + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] callIndex Call index that needs to be set + * @see _vc_core_cm_clear_outgoing_call + */ +gboolean _vc_core_cm_set_outgoing_call(call_vc_manager_t *pMng, int callIndex) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + if (pMng->setupcall_info.mocall_index != VC_INVALID_CALL_INDEX) { + CALL_ENG_DEBUG(ENG_DEBUG, "previous mo call not cleard!"); + return FALSE; + } + CALL_ENG_DEBUG(ENG_DEBUG, "index=%d", callIndex); + + pMng->setupcall_info.mocall_index = callIndex; + + return TRUE; +} + +/** + * This function retrieves the outgoing call handle + * + * @return Returns out going call handle on success and TAPI_INVALID_CALLHANDLE on failure + * @param[in] pMng Pointer to the call manager structure + */ +call_vc_handle _vc_core_cm_get_outgoing_call_handle(call_vc_manager_t *pMng) +{ + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + + if (pMng->setupcall_info.mocall_index == VC_INVALID_CALL_INDEX) { + return VC_TAPI_INVALID_CALLHANDLE; + } + + return pMng->callobject_info[pMng->setupcall_info.mocall_index].call_handle; +} + +/** + * This function retrieves the outgoing call information + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[out] pcall_object Pointer to the call object info structure + * @see _vc_core_cm_set_outgoing_call_info + */ +gboolean _vc_core_cm_get_outgoing_call_info(call_vc_manager_t *pMng, call_vc_call_objectinfo_t *pcall_object) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + if (pMng->setupcall_info.mocall_index == VC_INVALID_CALL_INDEX) + return FALSE; + memcpy(pcall_object, &pMng->callobject_info[pMng->setupcall_info.mocall_index], sizeof(call_vc_call_objectinfo_t)); + + return TRUE; +} + +/** + * This function sets the given outgoing call information + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] pcall_object Pointer to the call object info structure + * @see _vc_core_cm_get_outgoing_call_info + */ +gboolean _vc_core_cm_set_outgoing_call_info(call_vc_manager_t *pMng, call_vc_call_objectinfo_t *pcall_object) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + if (pMng->setupcall_info.mocall_index == VC_INVALID_CALL_INDEX) + return FALSE; + memcpy(&pMng->callobject_info[pMng->setupcall_info.mocall_index], pcall_object, sizeof(call_vc_call_objectinfo_t)); + + return TRUE; +} + +/** + * This function checks if outgoing call exists + * + * @return Returns TRUE if outgoing call exist FALSE otherwise + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_isexists_incoming_call, _vc_core_cm_isexists_connected_call + */ +gboolean _vc_core_cm_isexits_outgoing_call(call_vc_manager_t *pMng) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + if (pMng->setupcall_info.mocall_index == VC_INVALID_CALL_INDEX) + return FALSE; + else + return TRUE; +} + +/** + * This function sets the incoming call index + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] callIndex Call index of the incoming call + */ +gboolean _vc_core_cm_set_incoming_call(call_vc_manager_t *pMng, int callIndex) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + if (pMng->mtcall_index != VC_INVALID_CALL_INDEX) { + CALL_ENG_DEBUG(ENG_DEBUG, "previous mo call not cleard!"); + return FALSE; + } + CALL_ENG_DEBUG(ENG_DEBUG, "index=%d", callIndex); + pMng->mtcall_index = callIndex; + + return TRUE; +} + +/** +* This function retrieves the call handle of the incoming call +* +* @return Returns the call handle if success, TAPI_INVALID_CALLHANDLE on failure +* @param[in] pMng Pointer to the call manager structure +* @see _vc_core_cm_get_incoming_call_info +*/ +call_vc_handle _vc_core_cm_get_incoming_call_handle(call_vc_manager_t *pMng) +{ + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + + if (pMng->mtcall_index == VC_INVALID_CALL_INDEX) { + return VC_TAPI_INVALID_CALLHANDLE; + } + + return pMng->callobject_info[pMng->mtcall_index].call_handle; +} + +/** + * This function retrieves the call information of the incoming call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[out] pcall_object Pointer to the call object info structure + * @see _vc_core_cm_get_incoming_call_info, __vc_core_cm_set_incoming_call_info + */ +gboolean _vc_core_cm_get_incoming_call_info(call_vc_manager_t *pMng, call_vc_call_objectinfo_t *pcall_object) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_object != NULL); + + call_handle = _vc_core_cm_get_incoming_call_handle(pMng); + if (VC_TAPI_INVALID_CALLHANDLE == call_handle) { + return FALSE; + } + return _vc_core_cm_get_call_object(pMng, call_handle, pcall_object); +} + +/** + * This function sets the call information of the incoming call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] pcall_object Pointer to the call object info structure + * @see _vc_core_cm_get_incoming_call_info + */ +gboolean __vc_core_cm_set_incoming_call_info(call_vc_manager_t *pMng, call_vc_call_objectinfo_t *pcall_object) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_object != NULL); + + if (VC_INVALID_CALL_INDEX == pMng->mtcall_index) { + return FALSE; + } + memcpy(&pMng->callobject_info[pMng->mtcall_index], pcall_object, sizeof(call_vc_call_objectinfo_t)); + + return TRUE; +} + +/** + * This function checks if incoming call exists + * + * @return Returns TRUE if call exist FALSE otherwise + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_isexits_outgoing_call, _vc_core_cm_isexists_connected_call + */ +gboolean _vc_core_cm_isexists_incoming_call(call_vc_manager_t *pMng) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + CALL_ENG_DEBUG(ENG_DEBUG, "[pMng=0x%x]", pMng); + + CALL_ENG_DEBUG(ENG_DEBUG, "[pMng->mtcall_index=%d]", pMng->mtcall_index); + + if (pMng->mtcall_index == VC_INVALID_CALL_INDEX) + return FALSE; + else + return TRUE; +} + +/** + * This function retrieves the call handle of a given group and object position + * + * @return Returns call handle of the object + * @param[in] pMng Pointer to the call manager structure + * @param[in] nGroup Group index + * @param[in] nPos Call object index + */ +call_vc_handle _vc_core_cm_get_call_handle_ingroup_byposition(call_vc_manager_t *pMng, int nGroup, int nPos) +{ + int callIndex = 0; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(nGroup, 0, 1, VC_TAPI_INVALID_CALLHANDLE); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(nPos, 0, 4, VC_TAPI_INVALID_CALLHANDLE); + VOICECALL_RETURN_INVALID_IF_FAIL(pMng->callgroup_info[nGroup].state != CALL_VC_GROUP_STATE_NONE); + VOICECALL_RETURN_INVALID_IF_FAIL(nPos <= pMng->callgroup_info[nGroup].num); + + callIndex = pMng->callgroup_info[nGroup].callobject_index[nPos]; + + return pMng->callobject_info[callIndex].call_handle; +} + +/** + * This function retrieves the call handle of a given call ID + * + * @return Returns call handle of the object + * @param[in] pMng Pointer to the call manager structure + * @param[in] callID Call ID for a given call object + */ +call_vc_handle _vc_core_cm_get_call_handle_ingroup_bycallId(call_vc_manager_t *pMng, int callID) +{ + int i = 0; + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(callID, 1, 7, VC_TAPI_INVALID_CALLHANDLE); + + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if (pMng->callobject_info[i].call_id == callID) { + return pMng->callobject_info[i].call_handle; + } + } + + CALL_ENG_DEBUG(ENG_DEBUG, "return VC_TAPI_INVALID_CALLHANDLE"); + + return call_handle; + +} + +/** + * This function retrieves the call handle of a given telephone number + * + * @return Returns call handle of the object + * @param[in] pMng Pointer to the call manager structure + * @param[in] tel_number Telephone number of a call object + */ +call_vc_handle __vc_core_cm_get_call_handle_ingroup_bynumber(call_vc_manager_t *pMng, char *tel_number) +{ + int group = 0; + int i = 0; + int callIndex = 0; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_INVALID_IF_FAIL(tel_number != NULL); + + if (strlen(tel_number) == 0) { + return VC_TAPI_INVALID_CALLHANDLE; + } + + for (group = 0; group < CALL_VC_CALL_GROUP_MAX; group++) { + for (i = 0; i < pMng->callgroup_info[group].num; i++) { + callIndex = pMng->callgroup_info[group].callobject_index[i]; + if (strcmp(pMng->callobject_info[callIndex].tel_number, tel_number) == 0) { + return pMng->callobject_info[callIndex].call_handle; + } + } + } + + return VC_TAPI_INVALID_CALLHANDLE; + +} + +/** + * This function retrieves the call handle of the first active call + * + * @return Returns the call handle on sucess, -1 on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] pCall Pointer to the call handle where the retrieved call handle need to be stored + * @see _vc_core_cm_get_next_active_call_handle + */ +int _vc_core_cm_get_first_active_call_handle(call_vc_manager_t *pMng, call_vc_handle *pCall) +{ + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_INVALID_IF_FAIL(pCall != NULL); + + if (_vc_core_cm_get_total_members_ingroup(pMng) == 0 && _vc_core_cm_isexits_outgoing_call(pMng)) { + *pCall = _vc_core_cm_get_outgoing_call_handle(pMng); + return VC_TAPI_INVALID_CALLHANDLE; + + } + + return _vc_core_cm_get_next_active_call_handle(pMng, pCall, 0); +} + +/** + * This function retrieves the call handle of the first held call + * + * @return Returns the call handle on sucess, -1 on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] pCall Pointer to the call handle where the retrieved call handle need to be stored + * @see _vc_core_cm_get_next_held_call_handle + */ +int _vc_core_cm_get_first_held_call_handle(call_vc_manager_t *pMng, call_vc_handle *pCall) +{ + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_INVALID_IF_FAIL(pCall != NULL); + + return _vc_core_cm_get_next_held_call_handle(pMng, pCall, 0); +} + +/** + * This function retrieves the next active call handle + * + * @return Returns the call handle on sucess, -1 on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] pCall Pointer to the call handle where the retrieved call handle need to be stored + * @param[in] nPos Current position of the call object index + * @see _vc_core_cm_get_first_active_call_handle + */ +int _vc_core_cm_get_next_active_call_handle(call_vc_manager_t *pMng, call_vc_handle *pCall, int nPos) +{ + int i = 0; + int k = 0; + int callIndex = 0; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_INVALID_IF_FAIL(pCall != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_ACTIVE) + break; + } + if (i == CALL_VC_CALL_GROUP_MAX) { + *pCall = VC_TAPI_INVALID_CALLHANDLE; + return VC_TAPI_INVALID_CALLHANDLE; + } + + for (k = nPos; k < pMng->callgroup_info[i].num; k++) { + callIndex = pMng->callgroup_info[i].callobject_index[k]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + *pCall = pMng->callobject_info[callIndex].call_handle; + return k + 1; + } + } + + *pCall = VC_TAPI_INVALID_CALLHANDLE; + + return VC_TAPI_INVALID_CALLHANDLE; + +} + +/** + * This function retrieves the next held call handle + * + * @return Returns the call handle on sucess, -1 on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] pCall Pointer to the call handle where the retrieved call handle need to be stored + * @param[in] nPos Current position of the call object index + * @see _vc_core_cm_get_first_held_call_handle + */ +int _vc_core_cm_get_next_held_call_handle(call_vc_manager_t *pMng, call_vc_handle *pCall, int nPos) +{ + int i = 0; + int k = 0; + int callIndex = 0; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_INVALID_IF_FAIL(pCall != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_HOLD) + break; + } + if (i == CALL_VC_CALL_GROUP_MAX) { + *pCall = VC_TAPI_INVALID_CALLHANDLE; + return VC_TAPI_INVALID_CALLHANDLE; + } + + for (k = nPos; k < pMng->callgroup_info[i].num; k++) { + callIndex = pMng->callgroup_info[i].callobject_index[k]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + *pCall = pMng->callobject_info[callIndex].call_handle; + return k + 1; + } + } + + *pCall = VC_TAPI_INVALID_CALLHANDLE; + + return VC_TAPI_INVALID_CALLHANDLE; + +} + +/** + * This function checks if active call exists + * + * @return Returns TRUE if call exist FALSE otherwise + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_isexists_held_call + */ +gboolean _vc_core_cm_isexists_active_call(call_vc_manager_t *pMng) +{ + int i = 0; + int k = 0; + int callIndex = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_ACTIVE) + break; + } + if (i == CALL_VC_CALL_GROUP_MAX) { + return FALSE; + } + + for (k = 0; k < pMng->callgroup_info[i].num; k++) { + callIndex = pMng->callgroup_info[i].callobject_index[k]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + CALL_ENG_DEBUG(ENG_DEBUG, "returns TRUE"); + return TRUE; + } + } + + CALL_ENG_DEBUG(ENG_DEBUG, "returns FALSE"); + + return FALSE; + +} + +/** + * This function checks if held call exists + * + * @return Returns TRUE if call exist FALSE otherwise + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_isexists_active_call + */ +gboolean _vc_core_cm_isexists_held_call(call_vc_manager_t *pMng) +{ + int i = 0; + int k = 0; + int callIndex = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_HOLD) + break; + } + if (i == CALL_VC_CALL_GROUP_MAX) { + return FALSE; + } + + for (k = 0; k < pMng->callgroup_info[i].num; k++) { + callIndex = pMng->callgroup_info[i].callobject_index[k]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + CALL_ENG_DEBUG(ENG_DEBUG, "returns TRUE"); + + return TRUE; + } + } + CALL_ENG_DEBUG(ENG_DEBUG, "returns FALSE"); + return FALSE; +} + +/** + * This function retrieves the number of active calls + * + * @return Returns number of active calls + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_get_held_call_count + */ +int _vc_core_cm_get_active_call_count(call_vc_manager_t *pMng) +{ + int i = 0; + int k = 0; + int callIndex = 0; + int count = 0; + + VOICECALL_RETURN_ZERO_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_ACTIVE) + break; + } + if (i == CALL_VC_CALL_GROUP_MAX) { + return 0; + } + + count = 0; + for (k = 0; k < pMng->callgroup_info[i].num; k++) { + callIndex = pMng->callgroup_info[i].callobject_index[k]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + count++; + } + } + return count; +} + +/** + * This function retrieves the number of held calls + * + * @return Returns number of held calls + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_get_held_call_count + */ +int _vc_core_cm_get_held_call_count(call_vc_manager_t *pMng) +{ + int i = 0; + int k = 0; + int callIndex = 0; + int count = 0; + + VOICECALL_RETURN_ZERO_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_HOLD) + break; + } + if (i == CALL_VC_CALL_GROUP_MAX) { + return 0; + } + + count = 0; + for (k = 0; k < pMng->callgroup_info[i].num; k++) { + callIndex = pMng->callgroup_info[i].callobject_index[k]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + count++; + } + } + return count; +} + +/** + * This function retrieves the group index of active calls + * + * @return Returns the group index + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_get_held_group_index + */ +int _vc_core_cm_get_active_group_index(call_vc_manager_t *pMng) +{ + int i = 0; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (_vc_core_cm_get_group_state(pMng, i) == CALL_VC_GROUP_STATE_ACTIVE) + return i; + } + return VC_TAPI_INVALID_CALLHANDLE; +} + +/** + * This function retrieves the group index of held calls + * + * @return Returns the group index + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_get_active_group_index + */ +int _vc_core_cm_get_held_group_index(call_vc_manager_t *pMng) +{ + int i = 0; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (_vc_core_cm_get_group_state(pMng, i) == CALL_VC_GROUP_STATE_HOLD) + return i; + } + return VC_TAPI_INVALID_CALLHANDLE; + +} + + /** + * This function changes the state of the given onject info + * + * @return void + * @param[in] info Pointer to the call object into structure for which the state has to be changed + * @param[in] callState State that needs to be set + */ +void inline _vc_core_cm_change_call_state(call_vc_call_objectinfo_t *info, voicecall_call_state_t callState) +{ + VOICECALL_RETURN_IF_FAIL(info != NULL); + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d..%s(%d)-->%s(%d))", info->call_handle, gaszCallStateName[info->state], info->state, gaszCallStateName[callState], callState); + info->state = callState; +} + +/** + * This function dumps the complete information in the call manager + * + * @return void + * @param[in] info Pointer to the call manager structure + */ +void _vc_core_cm_test_dump(call_vc_manager_t *info) +{ + int i = 0; + int j = 0; + int count = 0; + char szBuffer[320]; + + VOICECALL_RETURN_IF_FAIL(info != NULL); + CALL_ENG_DEBUG(ENG_ERR, "************START*****************CALL_DETAILS_DUMP************START*****************"); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + char szTemp[10]; + memset(szTemp, 0, sizeof(szTemp)); + if (info->callgroup_info[i].state == CALL_VC_GROUP_STATE_NONE) { + snprintf(szTemp, 5, "%s", "NONE"); + } else if (info->callgroup_info[i].state == CALL_VC_GROUP_STATE_ACTIVE) { + snprintf(szTemp, 7, "%s", "ACTIVE"); + } else if (info->callgroup_info[i].state == CALL_VC_GROUP_STATE_HOLD) { + snprintf(szTemp, 5, "%s", "HOLD"); + } + + snprintf(szBuffer, (27 + sizeof(i) + sizeof(int) + sizeof(szTemp)), "__________ group=%d(num=%d) %s", i, info->callgroup_info[i].num, szTemp); + CALL_ENG_DEBUG(ENG_ERR, "%s", szBuffer); + for (j = 0; j < info->callgroup_info[i].num; j++) { + snprintf(szBuffer, (50 + sizeof(j) + sizeof(int) + sizeof(int) + VC_PHONE_NUMBER_LENGTH_MAX), + " __pos=%d, bufindex=%d, Call Handle = %d, [%s], state:[%d]", + j, info->callgroup_info[i].callobject_index[j], + info->callobject_info[info->callgroup_info[i].callobject_index[j]].call_handle, + info->callobject_info[info->callgroup_info[i].callobject_index[j]].tel_number, info->callobject_info[info->callgroup_info[i].callobject_index[j]].state); + CALL_ENG_DEBUG(ENG_ERR, "%s", szBuffer); + } + } + if (info->setupcall_info.mocall_index == VC_INVALID_CALL_INDEX) { + CALL_ENG_DEBUG(ENG_ERR, "_______ MO call not exist"); + } else { + CALL_ENG_DEBUG(ENG_ERR, "_______ MO callIndex=%d, Call Handle = %d, %s", + info->setupcall_info.mocall_index, info->callobject_info[info->setupcall_info.mocall_index].call_handle, info->callobject_info[info->setupcall_info.mocall_index].tel_number); + } + if (info->mtcall_index == VC_INVALID_CALL_INDEX) { + CALL_ENG_DEBUG(ENG_ERR, "_______ MT call not exist"); + } else { + CALL_ENG_DEBUG(ENG_ERR, "_______ MT callIndex=%d, Call Handle = %d, [%s], state:[%d]", + info->mtcall_index, info->callobject_info[info->mtcall_index].call_handle, info->callobject_info[info->mtcall_index].tel_number, info->callobject_info[info->mtcall_index].state); + } + count = 0; + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if (info->callobject_info[i].call_handle != VC_TAPI_INVALID_CALLHANDLE) { + count++; + } + } + CALL_ENG_DEBUG(ENG_ERR, "____Call Handle Num=%d", count); + CALL_ENG_DEBUG(ENG_ERR, "**************END*****************CALL_DETAILS_DUMP**************END*****************"); +} + +#ifdef UNUSED_APIS +unsigned long call_vc_cm_search_oldcall(call_vc_manager_t *pMng, gboolean activegroup) +{ + int index = 0; + int totalmember = 0; + int k = 0; + int min = 0; + unsigned long mintmconnected = 0; + + VOICECALL_RETURN_VALUE_IF_FAIL(pMng != NULL, 0); + if (activegroup == TRUE) { + index = _vc_core_cm_get_active_group_index(pMng); + } else if (activegroup == FALSE) { + index = _vc_core_cm_get_held_group_index(pMng); + } + + totalmember = pMng->callgroup_info[index].num; + + if (totalmember > 1) { + for (k = 1; k < totalmember; k++) { + if (pMng->callobject_info[pMng->callgroup_info[index].callobject_index[k]].connected_time < pMng->callobject_info[pMng->callgroup_info[index].callobject_index[min]].connected_time) { + min = k; + } + } + mintmconnected = pMng->callobject_info[pMng->callgroup_info[index].callobject_index[min]].connected_time; + } else if (totalmember == 1) + mintmconnected = pMng->callobject_info[pMng->callgroup_info[index].callobject_index[0]].connected_time; + + CALL_ENG_DEBUG(ENG_DEBUG, "index = %d", index); + CALL_ENG_DEBUG(ENG_DEBUG, "totalmember = %d", totalmember); + CALL_ENG_DEBUG(ENG_DEBUG, "min = %d", min); + CALL_ENG_DEBUG(ENG_DEBUG, "min tmconnected = %d", mintmconnected); + + return mintmconnected; + +} + +unsigned long call_vc_cm_search_next_oldcall(call_vc_manager_t *pMng, gboolean activegroup, call_vc_handle call_handle) +{ + int index = 0; + int totalmember = 0; + int i = 0; + int k = 0; + int min = 0; + int j = 0; + int searchinfonum = 0; + unsigned long mintmconnected = 0xFFFF; + unsigned long searchInfo[VC_MAX_CALL_GROUP_MEMBER]; + + VOICECALL_RETURN_VALUE_IF_FAIL(pMng != NULL, 0); + CALL_ENG_DEBUG(ENG_DEBUG, "ended call_handle = %d", call_handle); + + if (activegroup == TRUE) { + index = _vc_core_cm_get_active_group_index(pMng); + } else if (activegroup == FALSE) { + index = _vc_core_cm_get_held_group_index(pMng); + } + + totalmember = pMng->callgroup_info[index].num; + + CALL_ENG_DEBUG(ENG_DEBUG, "totalmember = %d", totalmember); + + for (i = 0; i < totalmember; i++) { + if (pMng->callobject_info[pMng->callgroup_info[index].callobject_index[i]].call_handle != call_handle) { + searchInfo[j] = pMng->callobject_info[pMng->callgroup_info[index].callobject_index[i]].connected_time; + CALL_ENG_DEBUG(ENG_DEBUG, "searchInfo[%d] = %d", j, searchInfo[j]); + j = j + 1; + } + } + + searchinfonum = j; + + CALL_ENG_DEBUG(ENG_DEBUG, "searchinfonum = %d", searchinfonum); + + if (searchinfonum > 1) { + for (k = 1; k < searchinfonum; k++) { + if (searchInfo[k] < searchInfo[min]) { + min = k; + } + } + mintmconnected = searchInfo[min]; + } else if (searchinfonum == 1) + mintmconnected = searchInfo[0]; + + CALL_ENG_DEBUG(ENG_DEBUG, "index = %d", index); + CALL_ENG_DEBUG(ENG_DEBUG, "min = %d", min); + CALL_ENG_DEBUG(ENG_DEBUG, "min tmconnected = %d", mintmconnected); + + return mintmconnected; + +} + +unsigned long call_vc_cm_gp_get_calltm_connected(call_vc_manager_t *pMng, int nGroup, int nPos) +{ + int callIndex = 0; + VOICECALL_RETURN_VALUE_IF_FAIL(pMng != NULL, 0); + VOICECALL_RETURN_VALUE_IF_FAIL((nGroup >= CALL_VC_CALL_GROUP_0 && nGroup < CALL_VC_CALL_GROUP_MAX), 0); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(nPos, 0, 4, 0); + + callIndex = pMng->callgroup_info[nGroup].callobject_index[nPos]; + return pMng->callobject_info[callIndex].connected_time; +} + +gboolean call_vc_cm_search_activecall(call_vc_manager_t *pMng, call_vc_handle call_handle) +{ + int i = 0; + int k = 0; + int callIndex = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_ACTIVE) + break; + } + if (i == CALL_VC_CALL_GROUP_MAX) { + return FALSE; + } + for (k = 0; k < pMng->callgroup_info[i].num; k++) { + callIndex = pMng->callgroup_info[i].callobject_index[k]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + if (call_handle == pMng->callobject_info[callIndex].call_handle) + return TRUE; + } + } + return FALSE; + +} + +gboolean call_vc_cm_search_activecall_ctinfo(call_vc_manager_t *pMng, call_vc_handle call_handle) +{ + int i = 0; + int k = 0; + int callIndex = 0; + gboolean bctinfo_found = FALSE; + gboolean bctinfo_atleast_one_found = FALSE; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_ACTIVE) + break; + } + if (i == CALL_VC_CALL_GROUP_MAX) { + return FALSE; + } + for (k = 0; k < pMng->callgroup_info[i].num; k++) { + callIndex = pMng->callgroup_info[i].callobject_index[k]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + bctinfo_found = pMng->callobject_info[callIndex].bctinfo_found; + CALL_ENG_DEBUG(ENG_DEBUG, "pMng->callobject_info[%d].bctinfo_found (%d).", callIndex, pMng->callobject_info[callIndex].bctinfo_found); + } + + bctinfo_atleast_one_found = bctinfo_found || bctinfo_atleast_one_found; + + } + + return bctinfo_atleast_one_found; + +} + +gboolean call_vc_cm_search_holdcall(call_vc_manager_t *pMng, call_vc_handle call_handle) +{ + int i = 0; + int k = 0; + int callIndex = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_HOLD) + break; + } + if (i == CALL_VC_CALL_GROUP_MAX) { + return FALSE; + } + for (k = 0; k < pMng->callgroup_info[i].num; k++) { + callIndex = pMng->callgroup_info[i].callobject_index[k]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + if (call_handle == pMng->callobject_info[callIndex].call_handle) + return TRUE; + } + } + return FALSE; +} + +gboolean call_vc_cm_search_holdcall_ctinfo(call_vc_manager_t *pMng, call_vc_handle call_handle) +{ + int i = 0; + int k = 0 callIndex; + gboolean bctinfo_found = FALSE; + gboolean bCtInfoAtLeastOnde = FALSE; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_HOLD) + break; + } + if (i == CALL_VC_CALL_GROUP_MAX) { + return FALSE; + } + for (k = 0; k < pMng->callgroup_info[i].num; k++) { + callIndex = pMng->callgroup_info[i].callobject_index[k]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + bctinfo_found = pMng->callobject_info[callIndex].bctinfo_found; + CALL_ENG_DEBUG(ENG_DEBUG, "pMng->callobject_info[%d].bctinfo_found (%d).", callIndex, pMng->callobject_info[callIndex].bctinfo_found); + } + + bCtInfoAtLeastOnde = bctinfo_found || bCtInfoAtLeastOnde; + } + return bCtInfoAtLeastOnde; +} +#endif + +/** + * This function retrieves an available call ID + * + * @return Call ID on success, -1 on failure + * @param[in] pMng Pointer to the call manager structure + */ +int _vc_core_cm_get_new_callId(call_vc_manager_t *pMng) +{ + gboolean bCheck[VC_MAX_CALL_ID]; + int i = 0; + + VOICECALL_RETURN_VALUE_IF_FAIL(pMng != NULL, VC_TAPI_INVALID_CALLHANDLE); + + memset(bCheck, 0, sizeof(bCheck)); + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if ((pMng->callobject_info[i].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[i].state != VC_CALL_STATE_ENDED_FINISH)) { + VOICECALL_RETURN_INVALID_IF_FAIL(((pMng->callobject_info[i].call_id >= 0) && (pMng->callobject_info[i].call_id <= VC_MAX_CALL_ID))); + if (pMng->callobject_info[i].call_id != 0) { + bCheck[pMng->callobject_info[i].call_id - 1] = TRUE; + } + } + } + + for (i = 0; i < VC_MAX_CALL_ID; i++) { + if (bCheck[i] == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "CallID=%d", i + 1); + return i + 1; + } + } + CALL_ENG_DEBUG(ENG_DEBUG, "fail to get id!"); + return VC_TAPI_INVALID_CALLHANDLE; +} + +/** + * This function checks if active/ held exists + * + * @return Returns TRUE if success else FALSE + * @param[in] pMng Pointer to the call manager structure + * @param[out] active_calls TRUE if active call exists, FALSE if held call exists + * @param[out] held_calls TRUE if held call exists, FALSE if held call exists + * @see _vc_core_cm_isexits_outgoing_call, _vc_core_cm_isexists_connected_call + */ +gboolean _vc_core_cm_isexists_call_ingroup(call_vc_manager_t *pMng, int *active_calls, int *held_calls) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(active_calls != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(held_calls != NULL); + + *active_calls = _vc_core_cm_isexists_active_call(pMng); + *held_calls = _vc_core_cm_isexists_held_call(pMng); + + CALL_ENG_DEBUG(ENG_DEBUG, "act_calls :%d", *active_calls); + CALL_ENG_DEBUG(ENG_DEBUG, "hld_calls :%d", *held_calls); + + return TRUE; +} + +/** + * This function changes the call state of the call object corresponds to the given call handle + * + * @return Returns TRUE if success else FALSE + * @param[in] pMng Pointer to the call manager structure + * @param[out] call_handle Call Handle of the Callobject to be modified + * @param[out] callState New call state to be set + */ +gboolean _vc_core_cm_change_call_object_state(call_vc_manager_t *pMng, call_vc_handle call_handle, voicecall_call_state_t callState) +{ + call_vc_call_objectinfo_t callobject_info; + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + if (VC_TAPI_INVALID_CALLHANDLE == call_handle) + return FALSE; + + _vc_core_cm_clear_call_object(&callobject_info); + + if (!_vc_core_cm_get_call_object(pMng, call_handle, &callobject_info)) + return FALSE; + + _vc_core_cm_change_call_state(&callobject_info, callState); + + _vc_core_cm_set_call_object(pMng, &callobject_info); + + return TRUE; + +} + +gboolean _vc_core_cm_get_ending_call_info(call_vc_manager_t *pMng) +{ + int i = 0; + gboolean bcall_ending = FALSE; + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if ((pMng->callobject_info[i].state == VC_CALL_STATE_ENDED) || (pMng->callobject_info[i].state == VC_CALL_STATE_ENDED_FINISH)) { + + CALL_ENG_DEBUG(ENG_DEBUG, "Tel(%s) is ending!!", pMng->callobject_info[i].tel_number); + bcall_ending = TRUE; + break; + } + } + return bcall_ending; +} diff --git a/call-engine/core/vc-core-ccbs.c b/call-engine/core/vc-core-ccbs.c new file mode 100755 index 0000000..41aff66 --- /dev/null +++ b/call-engine/core/vc-core-ccbs.c @@ -0,0 +1,111 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifdef _CCBS_DEFINED_ + +#include +#include + +#include "vc-core-ccbs.h" +#include "vc-core-util.h" +#include "vc-core-callagent.h" + +/** + * This function initializes the CCBS info + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Handle to the voicecall agent + */ +gboolean call_vc_init_ccbs_info(call_vc_callagent_state_t *pcall_agent) +{ + pcall_agent->ccbs_index = 0; + memset(&pcall_agent->ccbs_info, 0, sizeof(tapi_call_ccbs_info_t)*CALL_VC_CCBS_NUMBER_MAX); + return TRUE; +} + +/** + * This function checks if CCBS info is possible or not + * + * @return Returns TRUE if possible and FALSE if not possible + * @param[in] pcall_agent Handle to the voicecall agent + */ +gboolean call_vc_ccbs_info_possible(call_vc_callagent_state_t *pcall_agent) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + if (pcall_agent->ccbs_index < 0 || pcall_agent->ccbs_index >= CALL_VC_CCBS_NUMBER_MAX) { + return FALSE; + } + return TRUE; +} + +/** + * This function adds one CCBS information + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Handle to the voicecall agent + * @param[in] pCcbsInfo Pointer to the CCBS info structure + * @see call_vc_delete_oneccbs_info + */ +gboolean call_vc_add_oneccbs_info(call_vc_callagent_state_t *pcall_agent, tapi_call_ccbs_info_t *pCcbsInfo) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pCcbsInfo != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + if (!(pcall_agent->ccbs_index >= 0 && pcall_agent->ccbs_index < CALL_VC_CCBS_NUMBER_MAX)) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Free Index to add ccbs_index = %d", pcall_agent->ccbs_index); + return FALSE; + } + memcpy(&pcall_agent->ccbs_info[pcall_agent->ccbs_index++], pCcbsInfo, sizeof(tapi_call_ccbs_info_t)); + + return TRUE; +} + +/** + * This function deletes one CCBS information + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Handle to the voicecall agent + * @param[in] ccbsIndex Index of the CCBS info to be deleted + * @see call_vc_add_oneccbs_info + */ +gboolean call_vc_delete_oneccbs_info(call_vc_callagent_state_t *pcall_agent, int ccbsIndex) +{ + int i = 0; + int j = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + for (i = 0; i < pcall_agent->ccbs_index; i++) { + if (ccbsIndex == pcall_agent->ccbs_info[i].ccbs_info.index) { + for (j = i; j < pcall_agent->ccbs_index - 1; j++) { + memcpy(&pcall_agent->ccbs_info[j], &pcall_agent->ccbs_info[j + 1], sizeof(tapi_call_ccbs_info_t)); + } + + /*Remove the Last Index data*/ + memset(&pcall_agent->ccbs_info[j], 0, sizeof(tapi_call_ccbs_info_t)); + pcall_agent->ccbs_index--; + break; + } + } + if (i == pcall_agent->ccbs_index) + return FALSE; + + return TRUE; +} +#endif diff --git a/call-engine/core/vc-core-engine-group.c b/call-engine/core/vc-core-engine-group.c new file mode 100755 index 0000000..23f8bc5 --- /dev/null +++ b/call-engine/core/vc-core-engine-group.c @@ -0,0 +1,145 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vc-core-engine-group.h" +#include "vc-core-callagent.h" +#include "vc-core-engine.h" +#include "vc-core-ccbs.h" +#include "vc-core-tapi-rqst.h" +#include "vc-core-tapi-evnt.h" +#include "vc-core-svcall.h" + +/** +* This function retrieves the number of connected call members in the given group +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] group_index Group index of the group +* @param[out] pmember_num Pointer to the retrieved number of connected members +* @remarks pvoicecall_agent and pmember_num cannot be NULL. +* group_index shall only take 0 or 1 as input values +*/ +voicecall_error_t _vc_core_engine_group_get_connected_member_count(voicecall_engine_t *pvoicecall_agent, int group_index, int *pmember_num) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pmember_num != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + *pmember_num = _vc_core_cm_get_connected_member_count_ingroup(&pagent->call_manager, group_index); + + return ERROR_VOICECALL_NONE; +} + +/** +* This function retrives the number of groups in which atleast one call member is available +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] pnum_enabled_group Pointer to the number of enabled groups +* @remarks pvoicecall_agent and pnum_enabled_group cannot be NULL. +*/ +voicecall_error_t _vc_core_engine_group_get_enabled_group_count(voicecall_engine_t *pvoicecall_agent, int *pnum_enabled_group) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pnum_enabled_group != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + *pnum_enabled_group = _vc_core_cm_get_group_count(&pagent->call_manager); + + return ERROR_VOICECALL_NONE; +} + +/** +* This function retrieves the group indices of active and held calls +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] pact_grp_index Set to the group index of active calls +* @param[out] pheld_grp_index Set to the group index of held calls +* @remarks pvoicecall_agent, pact_grp_index and pheld_grp_index cannot be NULL. +*/ +voicecall_error_t _vc_core_engine_group_get_group_indices(voicecall_engine_t *pvoicecall_agent, int *pact_grp_index, int *pheld_grp_index) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pact_grp_index != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pheld_grp_index != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + *pact_grp_index = _vc_core_cm_get_active_group_index(&pagent->call_manager); + *pheld_grp_index = _vc_core_cm_get_held_group_index(&pagent->call_manager); + + return ERROR_VOICECALL_NONE; +} + +/** +* This function retrieves the call handle of the call member given its groupe index and position in the group +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] group_index Group index of the group +* @param[in] pos Position of the call in the group +* @param[out] pcall_handle Pointer to the call handle to be retrieved +* @remarks pvoicecall_agent and pcall_handle cannot be NULL. +*/ +voicecall_error_t _vc_core_engine_group_get_call_handle_byposition(voicecall_engine_t *pvoicecall_agent, int group_index, int pos, int *pcall_handle) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + int callhandle = -1; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_handle != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(group_index, 0, 1, ERROR_VOICECALL_INVALID_ARGUMENTS) + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(pos, 0, 4, ERROR_VOICECALL_INVALID_ARGUMENTS) + + callhandle = _vc_core_cm_get_call_handle_ingroup_byposition(&pagent->call_manager, group_index, pos);; + + if (callhandle != -1) { + *pcall_handle = callhandle; + return ERROR_VOICECALL_NONE; + } + + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; +} + +/** +* This function checks if connected call exists in a given group +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] group_index Group index of the group +* @param[out] bcall_exists TRUE - if call exists, FALSE otherwise +* @remarks pvoicecall_agent and bcall_exists cannot be NULL. +* group_index shall only take 0 or 1 as input values +*/ +voicecall_error_t _vc_core_engine_group_isexists_connected_call_ingroup(voicecall_engine_t *pvoicecall_agent, int group_index, gboolean *bcall_exists) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(bcall_exists != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(group_index, 0, 1, ERROR_VOICECALL_INVALID_ARGUMENTS); + + if (CALL_VC_GROUP_STATE_NONE == _vc_core_cm_get_group_state(&pagent->call_manager, group_index)) { + *bcall_exists = FALSE; + } + + if (0 == _vc_core_cm_get_connected_member_count_ingroup(&pagent->call_manager, group_index)) { + *bcall_exists = FALSE; + } else { + *bcall_exists = TRUE; + } + + return ERROR_VOICECALL_NONE; +} diff --git a/call-engine/core/vc-core-engine-status.c b/call-engine/core/vc-core-engine-status.c new file mode 100755 index 0000000..d5f4fe1 --- /dev/null +++ b/call-engine/core/vc-core-engine-status.c @@ -0,0 +1,755 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +/* Call Module File Includes */ +#include "vc-core-engine.h" +#include "vc-core-callagent.h" +#include "vc-core-callmanager.h" +#include "vc-core-util.h" +#include "vc-core-tapi-evnt.h" +#include "vc-core-tapi-rqst.h" +#include "vc-core-svcall.h" +#include "vc-core-engine-status.h" + +/** +* This function checks whether the given incoming call is a restricted call or not +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_handle Call handle of the call to be checked +* @param[out] pbrestricted Pointer to the restricted name mode +* @remarks pvoicecall_agent and prestricted cannot be NULL. +* This API shall only be used with the incoming call handle before it is connected +*/ +voicecall_error_t _vc_core_engine_status_isrestricted_call(voicecall_engine_t *pvoicecall_agent, int call_handle, gboolean *pbrestricted) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_call_objectinfo_t call_object; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(call_handle >= 0, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pbrestricted != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + _vc_core_cm_clear_call_object(&call_object); + if (TRUE == _vc_core_cm_get_call_object(&pagent->call_manager, call_handle, &call_object)) { + *pbrestricted = call_object.brestricted_namemode; + return ERROR_VOICECALL_NONE; + } + + *pbrestricted = FALSE; + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; +} + +/** +* This function checks whether the given incoming call is a restricted call or not +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_handle Call handle of the call to be checked +* @param[out] pbrestricted Pointer to the restricted name mode +* @remarks pvoicecall_agent and prestricted cannot be NULL. +* This API shall only be used with the incoming call handle before it is connected +*/ +voicecall_error_t _vc_core_engine_status_get_calling_namemode(voicecall_engine_t *pvoicecall_agent, int call_handle, gboolean * bcalling_namemode) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_call_objectinfo_t call_object; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(call_handle >= 0, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(bcalling_namemode != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + _vc_core_cm_clear_call_object(&call_object); + if (TRUE == _vc_core_cm_get_call_object(&pagent->call_manager, call_handle, &call_object)) { + if (call_object.bcalling_namemode == CALL_VC_CALLING_NAME_MODE_AVAILABLE) { + *bcalling_namemode = TRUE; + } else { + *bcalling_namemode = FALSE; + } + return ERROR_VOICECALL_NONE; + } + + *bcalling_namemode = FALSE; + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; +} + +/** +* This function retrieves the call object belongs to the given call handle +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_handle Call handle of the call for which the call object is retrieved +* @param[out] pcall_object Pointer to the retrived call object info +* @remarks pvoicecall_agent and pcall_object cannot be NULL. +*/ +voicecall_error_t _vc_core_engine_status_get_call_object(voicecall_engine_t *pvoicecall_agent, int call_handle, call_vc_call_objectinfo_t *pcall_object) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(call_handle >= 0, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_object != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*Clear the call object */ + _vc_core_cm_clear_call_object(pcall_object); + + if (TRUE == _vc_core_cm_get_call_object(&pagent->call_manager, call_handle, pcall_object)) { + return ERROR_VOICECALL_NONE; + } + + pcall_object = NULL; + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; +} + +/** +* This function retrieves the inout state of the engine +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] pio_state Contains the Engine InOut state on return +* @remarks pvoicecall_agent and pio_state cannot be NULL. +* @see _vc_core_engine_change_engine_iostate +*/ +voicecall_error_t _vc_core_engine_status_get_engine_iostate(voicecall_engine_t *pvoicecall_agent, int *pio_state) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pio_state != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + *pio_state = pagent->io_state; + CALL_ENG_DEBUG(ENG_DEBUG, "io_state = [%d]", pagent->io_state); + return ERROR_VOICECALL_NONE; +} + +/** +* This function checks whether connected call exists or not +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_type call type +* @param[out] bcall_exists TRUE - if call exists of given given type, FALSE otherwise +* @remarks pvoicecall_agent and bcall_exists cannot be NULL. +*/ +voicecall_error_t _vc_core_engine_status_isexists_call_bytype(voicecall_engine_t *pvoicecall_agent, voicecall_call_type_t call_type, gboolean *bcall_exists) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(bcall_exists != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*CALL_ENG_DEBUG(ENG_DEBUG,"call_type = %d", call_type);*/ + *bcall_exists = FALSE; + switch (call_type) { + case VC_INCOMING_CALL: + { + if (VC_INVALID_CALL_INDEX != pagent->call_manager.mtcall_index) { + CALL_ENG_DEBUG(ENG_DEBUG, "incoming call exits..."); + + *bcall_exists = TRUE; + return ERROR_VOICECALL_NONE; + } + } + break; + case VC_OUTGOING_CALL: + { + if (VC_INVALID_CALL_INDEX != pagent->call_manager.setupcall_info.mocall_index) { + CALL_ENG_DEBUG(ENG_DEBUG, "outgoing call exits..."); + + *bcall_exists = TRUE; + return ERROR_VOICECALL_NONE; + } + } + break; + case VC_CONNECTED_CALL: + { + *bcall_exists = _vc_core_cm_isexists_connected_call(&pagent->call_manager); + if (*bcall_exists == TRUE) { + CALL_ENG_DEBUG(ENG_DEBUG, "connected call exits..."); + } + return ERROR_VOICECALL_NONE; + } + break; + default: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Invalid call type.."); + return ERROR_VOICECALL_INVALID_CALL_TYPE; + } + } + + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; +} + +/** +* This function retrieves the total number of call members currently available with the engine +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] ptotal_call_member Contains the total call member availalbe in engine on return +* @remarks pvoicecall_agent and ptotal_call_member cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_get_call_member_count(voicecall_engine_t *pvoicecall_agent, int *ptotal_call_member) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(ptotal_call_member != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + *ptotal_call_member = _vc_core_cm_get_call_member_count(&pagent->call_manager); + + return ERROR_VOICECALL_NONE; +} + +/** +* This function retrieves the total number of call members with the given connected call type +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] connected_call_type connected call type +* @param[out] pmember_num Contains the number of call members available with the given connected call type on return +* @remarks pvoicecall_agent and pmember_num cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_get_call_member_info(voicecall_engine_t *pvoicecall_agent, voicecall_connected_call_type_t connected_call_type, int *pmember_num) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pmember_num != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + switch (connected_call_type) { + case VC_ACTIVE_CALL: + { + *pmember_num = _vc_core_cm_get_active_call_count(&pagent->call_manager); + } + break; + case VC_HELD_CALL: + { + *pmember_num = _vc_core_cm_get_held_call_count(&pagent->call_manager); + } + break; + default: + *pmember_num = 0; + return ERROR_VOICECALL_INVALID_CALL_TYPE; + } + + return ERROR_VOICECALL_NONE; +} + +/** +* This function retrieves the call handle according to the given call type +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_type call type +* @param[out] pcall_handle Contains the call handle on success +* @remarks pvoicecall_agent and pcall_handle cannot be NULL +* In case of multiple connected calls available, it will retreive the first connected call +*/ +voicecall_error_t _vc_core_engine_status_get_call_handle_bytype(voicecall_engine_t *pvoicecall_agent, voicecall_call_type_t call_type, int *pcall_handle) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_manager_t *pcall_manager = NULL; + call_vc_handle call_handle = -1; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_handle != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + pcall_manager = (call_vc_manager_t *) &pagent->call_manager; + + switch (call_type) { + case VC_INCOMING_CALL: + { + call_handle = _vc_core_cm_get_incoming_call_handle(pcall_manager); + } + break; + case VC_OUTGOING_CALL: + { + call_handle = _vc_core_cm_get_outgoing_call_handle(pcall_manager); + } + break; + case VC_CONNECTED_CALL: + { + _vc_core_cm_get_first_active_call_handle(pcall_manager, &call_handle); + if (-1 == call_handle) { + _vc_core_cm_get_first_held_call_handle(pcall_manager, &call_handle); + } + } + break; + default: + return ERROR_VOICECALL_INVALID_CALL_TYPE; + } + + if (-1 == call_handle) { + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + } + + *pcall_handle = call_handle; + return ERROR_VOICECALL_NONE; +} + +/** +* This function checks if active calls and/or held call exists or not +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] pactive_calls Set to TRUE if active calls exist +* @param[out] pheld_calls Set to TRUE if held calls exist +* @remarks pvoicecall_agent,pactive_calls and pheld_calls cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_isexists_any_call(voicecall_engine_t *pvoicecall_agent, gboolean *pactive_calls, gboolean *pheld_calls) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_manager_t *pcall_manager = NULL; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pactive_calls != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pheld_calls != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + pcall_manager = &pagent->call_manager; + + *pactive_calls = _vc_core_cm_isexists_active_call(pcall_manager); + *pheld_calls = _vc_core_cm_isexists_held_call(pcall_manager); + + return ERROR_VOICECALL_NONE; +} + +/** +* This function retreives the cphs csp status +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] csp_service csp name +* @param[out] pbcsp_status Contains TRUE if given csp service is enabled,FALSE otherwise +* @remarks pvoicecall_agent and pbcsp_status cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_get_cphs_csp_status(voicecall_engine_t *pvoicecall_agent, voicecall_cphs_csp_service csp_service, gboolean *pbcsp_status) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pbcsp_status != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); +#ifdef _CPHS_DEFINED_ + *pbcsp_status = _vc_core_svcall_cphs_csp_get_status(pcall_agent, csp_service); +#else + *pbcsp_status = (VC_CPHS_CSP_ALS == csp_service) ? FALSE : TRUE; +#endif + return ERROR_VOICECALL_NONE; +} + +/** +* This function checks if the call is emergency call for the given outgoing call index +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] mo_call_index Index of the outgoing call +* @param[out] pbemergency_call Contains TRUE if the call is emergency call,FALSE otherwise +* @remarks pvoicecall_agent and pbemergency_call cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_check_emergency_byindex(voicecall_engine_t *pvoicecall_agent, int mo_call_index, gboolean *pbemergency_call) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_manager_t *pcall_manager = NULL; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pbemergency_call != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(mo_call_index, 0, 7, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*Assign Default Value */ + *pbemergency_call = FALSE; + + pcall_manager = (call_vc_manager_t *) &pagent->call_manager; + + CALL_VC_DUMP_CALLDETAILS(pcall_manager); + CALL_ENG_DEBUG(ENG_DEBUG, "call_index = %d, bemergency_number = %d", mo_call_index, pcall_manager->callobject_info[mo_call_index].bemergency_number); + + *pbemergency_call = pcall_manager->callobject_info[mo_call_index].bemergency_number; + return ERROR_VOICECALL_NONE; +} + +/** +* This function checks and returns the FDN status +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pcall_agent Handle to Voicecall Engine - Currently not used, reserved for future use +* @param[out] bfdn_enabled TRUE - if FDN is enabled, FALSE otherwise +* @remarks pvoicecall_agent and bfdn_anabled cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_isenabled_fdn(voicecall_engine_t *pcall_agent, gboolean *bfdn_enabled) +{ + gboolean bfdn = FALSE; + VOICECALL_RETURN_VALUE_IF_FAIL(bfdn_enabled != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + CALL_ENG_KPI("tel_get_sim_fdn_status start"); + if (TAPI_API_SUCCESS == tel_get_sim_fdn_status(&bfdn)) { + *bfdn_enabled = bfdn; + return ERROR_VOICECALL_NONE; + } + CALL_ENG_KPI("tel_get_sim_fdn_status done"); + + *bfdn_enabled = FALSE; + return ERROR_VOICECALL_TAPI_ERROR; +} + +/** +* This function checks the possiblity of transfering calls +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[out] pbtransfer_calls Contains TRUE if call transfer is possible, FALSE otherwise +* @remarks pvoicecall_agent and pbtransfer_calls cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_is_transfer_call_possible(voicecall_engine_t *pvoicecall_agent, gboolean *pbtransfer_calls) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pbtransfer_calls != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + *pbtransfer_calls = _vc_core_ca_is_transfer_call_possible(pcall_agent); + + return ERROR_VOICECALL_NONE; +} + +/** +* This function checks the possiblity of making conference calls +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[out] pbconf_call Contains TRUE if conference call is possible , FALSE otherwise +* @remarks pvoicecall_agent and pbconf_call cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_is_conf_call_possible(voicecall_engine_t *pvoicecall_agent, gboolean *pbconf_call) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + gboolean active_calls = FALSE; + gboolean held_calls = FALSE; + int total_call_member = 0; + gboolean bconf = FALSE; + + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pbconf_call != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + +#ifdef _CPHS_DEFINED_ + if (_vc_core_svcall_cphs_csp_get_status(pcall_agent, VC_CPHS_CSP_MPTY)) { + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_svcall_cphs_csp_get_status returned TRUE"); + *pbconf_call = TRUE; + } else { + *pbconf_call = FALSE; + return ERROR_VOICECALL_NONE; + } +#endif + + _vc_core_cm_isexists_call_ingroup(&pcall_agent->call_manager, &active_calls, &held_calls); + total_call_member = _vc_core_cm_get_call_member_count(&pcall_agent->call_manager); + + /* Joining call is impossile when !active or !hold call exist */ + if (!active_calls || !held_calls) { + CALL_ENG_DEBUG(ENG_DEBUG, "Join Impossible..."); + bconf = FALSE; + } else { + /* Joining call is impossile when member is more than max + Max Number in Group + Another Call*/ + if (total_call_member >= (VC_MAX_CALL_GROUP_MEMBER + 1)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Ended with FALSE..."); + bconf = FALSE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Ended with TRUE..."); + bconf = TRUE; + } + } + + *pbconf_call = bconf; + return ERROR_VOICECALL_NONE; + +} + +/** +* This function retreives the call state of the given call +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_handle Call handle of particular call +* @param[out] pcall_state Contains the call state of the given call handle +* @remarks pvoicecall_agent and pcall_state cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_get_call_state_byhandle(voicecall_engine_t *pvoicecall_agent, int call_handle, voicecall_call_state_t *pcall_state) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_call_objectinfo_t call_object = { 0 }; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_CALL_HANDLE); + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_state != NULL, ERROR_VOICECALL_INVALID_CALL_HANDLE); + VOICECALL_RETURN_VALUE_IF_FAIL(call_handle >= 0, ERROR_VOICECALL_INVALID_CALL_HANDLE); + + _vc_core_cm_clear_call_object(&call_object); + if (TRUE == _vc_core_cm_get_call_object(&pagent->call_manager, call_handle, &call_object)) { + *pcall_state = call_object.state; + return ERROR_VOICECALL_NONE; + } + + *pcall_state = VC_CALL_STATE_NONE; + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; +} + +#if 0 /*unused*/ +/** +* This function retrieves call handle of the any one of the calls of given type +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] connected_call_type Connected call type +* @param[out] pcall_handle Contains the Call handle on return +* @remarks pvoicecall_agent and pcall_handle cannot be NULL +*/ +voicecall_error_t voicecall_get_any_call_handle(voicecall_engine_t *pvoicecall_agent, voicecall_connected_call_type_t connected_call_type, int *pcall_handle) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_handle callhandle = -1; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_handle != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + switch (connected_call_type) { + case VC_ACTIVE_CALL: + { + _vc_core_cm_get_first_active_call_handle(&pagent->call_manager, &callhandle); + } + break; + case VC_HELD_CALL: + { + _vc_core_cm_get_first_held_call_handle(&pagent->call_manager, &callhandle); + } + break; + default: + return ERROR_VOICECALL_INVALID_CALL_TYPE; + } + + if (-1 != callhandle) { + *pcall_handle = (int)callhandle; + return ERROR_VOICECALL_NONE; + } + + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; +} +#endif + +/** +* This function checks if any call is ending and retrieves its call number if it is ending +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] bcall_ending TRUE if any call is being ended, FALSE otherwise +* @remarks pvoicecall_agent and bcall_ending cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_is_any_call_ending(voicecall_engine_t *pvoicecall_agent, gboolean *bcall_ending) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(bcall_ending != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + *bcall_ending = FALSE; + *bcall_ending = _vc_core_cm_get_ending_call_info(&pagent->call_manager); + + return ERROR_VOICECALL_NONE; +} + +/** +* This function checks whther engine is busy in processing any events or waiting for any events to process +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] bbusy TRUE - if engine is busy in processing any events or waiting for any events, FALSE - otherwise +* @remarks pvoicecall_agent and bbusy cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_is_engine_busy(voicecall_engine_t *pvoicecall_agent, gboolean *bbusy) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(bbusy != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + CALL_ENG_DEBUG(ENG_DEBUG, "Current Call Agent State:%d", pagent->callagent_state); + if (CALL_VC_CA_STATE_NORMAL == pagent->callagent_state) { + *bbusy = FALSE; + } else { + *bbusy = TRUE; + } + + return ERROR_VOICECALL_NONE; +} + +/** +* This function sets the given flag to engine for processing during call end. +* This function has to be used after calling the end call API +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] end_flag End Flag to be set +* @remarks pvoicecall_agent and bsscode cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_set_end_flag(voicecall_engine_t *pvoicecall_agent, voicecall_end_flag_t end_flag) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + switch (end_flag) { + case VC_RETREIVE_CALL_ON_MOCALL_END: + { + pagent->callagent_state = CALL_VC_CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL; + } + break; + default: + return ERROR_VOICECALL_INVALID_ARGUMENTS; + } + + return ERROR_VOICECALL_NONE; +} + +/** +* This function checks whether the given string is MMI string or not +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] pinput_number Input string to be verified +* @param[out] bsscode TRUE - if the given string is a valid ss code, FALSE otherwise +* @remarks pvoicecall_agent and bsscode cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_isvalid_ss_code(voicecall_engine_t *pvoicecall_agent, const char *pinput_number, gboolean *bsscode) +{ + int strLen = 0; + call_vc_ss_si_format si_format = SS_SI_FORMAT_INVALID; + + VOICECALL_RETURN_VALUE_IF_FAIL(pvoicecall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pinput_number != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(bsscode != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + si_format = SS_SI_FORMAT_VALID; + strLen = strlen(pinput_number); + + CALL_ENG_DEBUG(ENG_DEBUG, "strLen = %d", strLen); + + if (strLen > 2) { + /* Deactivate : "#...#" */ + /* Erase : "##...#" */ + if (((pinput_number[0] == '#') && (pinput_number[strLen - 1] == '#')) || ((pinput_number[0] == '+') && (pinput_number[1] == '#') && (pinput_number[strLen - 1] == '#'))) { + si_format = _vc_core_util_check_si_format(pinput_number); + *bsscode = TRUE; + return ERROR_VOICECALL_NONE; + } + + /* Activate : "*...#" */ + /* Interrogate : "*#...#" */ + /* Register : "**...#" */ + if ((('*' == pinput_number[0]) && ('#' == pinput_number[strLen - 1])) || (('+' == pinput_number[0]) && ('*' == pinput_number[1]) && ('#' == pinput_number[strLen - 1]))) { + si_format = _vc_core_util_check_si_format(pinput_number); + *bsscode = TRUE; + return ERROR_VOICECALL_NONE; + } + } else if (2 == strLen) { +/*This will be covered, once the operator requirements are clear*/ +#ifdef MCC_USA_SS_CODE + unsigned long mcc = 0; + tapi_network_info_t networkInfo; + + memset(&networkInfo, 0x00, sizeof(tapi_network_info_t)); + + tapi_get_network_info(&networkInfo); + + networkInfo.sysid.sysid = (networkInfo.sysid.sysid >> 16); + mcc = (networkInfo.sysid.sysid & 0x0000ffff); + CALL_ENG_DEBUG(ENG_DEBUG, "mcc (%d)!!", mcc); + + /*CALL_NETWORK_MCC_USA */ + if (mcc == 0x136) { + if (strncmp(pinput_number, "08", 2) == 0 || strncmp(pinput_number, "00", 2) == 0) + *bsscode = FALSE; + } +#endif + /*08 is not a ss string.*/ + if (strncmp(pinput_number, "08", 2) == 0) { + *bsscode = FALSE; + } else { + /*All two digit number should be handled as ss string during call.*/ + CALL_ENG_DEBUG(ENG_DEBUG, "two digit number... returns TRUE"); + *bsscode = TRUE; + } + + return ERROR_VOICECALL_NONE; + } else if (1 == strLen) { + if (('#' == pinput_number[0]) || ('+' == pinput_number[0]) || ('*' == pinput_number[0]) || ('7' == pinput_number[0])) { + *bsscode = TRUE; + return ERROR_VOICECALL_NONE; + } + } + + CALL_ENG_DEBUG(ENG_DEBUG, "invalid sscode... returns FALSE"); + *bsscode = FALSE; + + return ERROR_VOICECALL_NONE; +} + +voicecall_error_t _vc_core_engine_status_dump_call_details(voicecall_engine_t *pvoicecall_agent) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + CALL_ENG_DEBUG(ENG_DEBUG, ""); + _vc_core_cm_test_dump(&pagent->call_manager); + return ERROR_VOICECALL_NONE; +} + +/** +* This function checks the possiblity of making private calls +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[out] bzuhause Contains TRUE if zuhause area, FALSE otherwise +* @remarks pvoicecall_agent and pbprivate_call cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_is_zuhause_area(voicecall_engine_t *pvoicecall_agent, gboolean *bzuhause) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(bzuhause != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + *bzuhause = _vc_core_util_check_zuhause_status(); + return ERROR_VOICECALL_NONE; +} + +/** +* This function checks the possiblity of making private calls +* +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[out] b_download_call Contains TRUE if zuhause area, FALSE otherwise +* @remarks pvoicecall_agent and pbprivate_call cannot be NULL +*/ +void _vc_core_engine_status_set_download_call(voicecall_engine_t *pvoicecall_agent, gboolean b_download_call) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + + if (pagent == NULL) { + CALL_ENG_DEBUG(ENG_ERR, "pagent is NULL! [PROBLEM] !!!"); + return; + } + + pagent->bdownload_call = b_download_call; + +} + +gboolean _vc_core_engine_status_get_download_call(voicecall_engine_t *pvoicecall_agent) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + return pcall_agent->bdownload_call; +} diff --git a/call-engine/core/vc-core-engine.c b/call-engine/core/vc-core-engine.c new file mode 100755 index 0000000..cafbfd5 --- /dev/null +++ b/call-engine/core/vc-core-engine.c @@ -0,0 +1,3221 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include + +/* Call Module File Includes */ +#include "vc-core-engine.h" +#include "vc-core-callagent.h" +#include "vc-core-callmanager.h" +#include "vc-core-util.h" +#include "vc-core-tapi-evnt.h" +#include "vc-core-tapi-rqst.h" +#include "vc-core-svcall.h" +#include "vc-core-engine-status.h" + +/*Global Variable Declerations */ + +/*Incoming Call Details used for Self Event*/ +static call_vc_handle gincoming_call_handle = VC_TAPI_INVALID_CALLHANDLE; +static TelCallIncomingCallInfo_t gincoming_call_info; + +/*Initialization Global Variables*/ +static gboolean gphone_init_finished = FALSE; +static call_vc_handle gphone_rejected_call = VC_TAPI_INVALID_CALLHANDLE; + +static call_vc_callagent_state_t *gpcall_agent_for_callback = NULL; +/* SAT call detail used for self event */ +static int gsat_event_type = 0; +static int gtype = 0; +static void *gpresult = NULL; +static TelSatSetupCallIndCallData_t gSatSetupCallInfo; +static TelSatSendDtmfIndDtmfData_t gSatSendDtmfInfo; + +/*Local Function Declarations*/ +/** + * This function handles the end event for outgoing call + * + * @internal + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Handle to the call agent + * @param[in] call_handle call handle of the outgoing call + * @param[in] type type of the tapi event + * @param[in] tapi_cause tapi cause + */ +static gboolean __call_vc_outgoingcall_endhandle(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, int type, TelTapiEndCause_t tapi_cause); +/** + * This function handles the end event for incoming call + * + * @internal + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Handle to the call agent + * @param[in] call_handle call handle of the outgoing call + */ +static gboolean __call_vc_incomingcall_endhandle(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle); +/** + * This function checks whether the call agent is in any of the wait state + * + * @internal + * @return Returns TRUE on if call agent is in wait state or FALSE + * @param[in] pcall_agent Handle to the call agent + */ +static gboolean __call_vc_is_callagent_waitstate(call_vc_callagent_state_t *pcall_agent); +/** + * This function creates call details for outgoign call with the given setup info + * + * @internal + * @return Returns TRUE on if call agent is in wait state or FALSE + * @param[in] pagent Handle to the call agent + * @param[in] psetup_call_info Setup info + * @param[out] pcall_object Call object containing call details + * @param[out] error_code Error Code + */ +static gboolean __call_vc_create_outgoing_callinfo(call_vc_callagent_state_t *pagent, voicecall_setup_info_t *psetup_call_info, call_vc_call_objectinfo_t *pcall_object, int *error_code); + +/** + * This function handles all telephony events + * + * @internal + * @return Returns TRUE on if call agent is in wait state or FALSE + * @param[in] event tapi event data + * @param[in] userdata user callback data + */ + +static void __call_vc_handle_tapi_events(TelTapiEvent_t *event, void *userdata); + +/** +* This function handles sat engine notification +* +* @internal +* @return Returns TRUE on success or FALSE on failure +* @param[in] event tapi event data +* @param[in] userdata user callback data +*/ +static void __call_vc_handle_sat_engine_events_cb(TelTapiEvent_t *event, void *userdata); + +/** +* This function subscribes for all notifications required for voicecall engine +* +* @internal +* @return Returns TRUE on success or FALSE on failure +* @param[in] pcall_agent handle to voicecall agent structure +*/ +static gboolean __call_vc_subscribe_call_events(call_vc_callagent_state_t *pcall_agent); + +/** +* This function handles telephony initialized notifications +* +* @internal +* @return Returns TRUE on success or FALSE on failure +* @param[in] event tapi event data +* @param[in] userdata user callback data +*/ +static void __call_vc_tapi_initialized_cb(TelTapiEvent_t *event, void *userdata); + +/** +* This function subscribes for telephony call notifications +* +* @internal +* @return Returns TRUE on success or FALSE on failure +* @param[in] pcall_agent handle to voicecall agent structure +*/ +static gboolean __call_vc_subscribe_tapi_event(call_vc_callagent_state_t *pcall_agent); + +/** +* This function request the engine to setup a sat call +* +* @internal +* @return Returns TRUE on success or FALSE on failure +* @param[in] pagent handle to voicecall agent structure +* @param[in] mo_call_index call index of the mo call prepared for sat call +* @param[in] ret_code Error code +* @exception ERROR_VOICECALL_TAPI_CAUSE_CALL_FAILED +*/ +static gboolean __call_vc_request_sat_call(call_vc_callagent_state_t *pagent, int mo_call_index, int *ret_code); + +/** +* This function hadles the events from the sat engine +* +* @internal +* @return Returns TRUE on success or FALSE on failure +* @param[in] pcall_agent handle to voicecall agent structure +* @param[in] sat_event event type (sat request / sat response) +* @param[in] sat_event_type sat event sub type +* @param[in] type event type received from sat +* @param[in] result data received from sat +*/ +static gboolean __call_vc_handle_sat_engine_events(call_vc_callagent_state_t *pcall_agent, int sat_event, int sat_event_type, int type, void *result); + +/** +* This function request the engine to setup a normal voice call +* +* @internal +* @return Returns TRUE on success or FALSE on failure +* @param[in] pagent handle to voicecall agent structure +* @param[in] mo_call_index call index of the mo call prepared for sat call +* @param[in] ret_code Error code +* @exception ERROR_VOICECALL_TAPI_CAUSE_CALL_FAILED +*/ +static gboolean __call_vc_request_call(call_vc_callagent_state_t *pagent, int mo_call_index, int *ret_code); + +/** +* This function serves as the callback function for the incoming call idle add function +* +* @return Returns TRUE - if the callback has to be called again, FALSE otherwise +* @param[in] puser_data data set by the user +*/ +static gboolean __call_vc_incoming_idle_cb(gpointer puser_data); +static gboolean __call_vc_incoming_call_end_idle_cb(gpointer puser_data); +static gboolean __call_vc_reject_call_idle_cb(gpointer puser_data); +static gboolean __call_vc_reject_call_full_idle_cb(gpointer puser_data); + +/** +* This function serves as the callback function for the SAT idle add function +* +* @return Returns TRUE - if the callback has to be called again, FALSE otherwise +* @param[in] puser_data data set by the user +*/ +static gboolean __call_vc_sat_idle_cb(gpointer puser_data); + +/** + * This function checks the voicecall engine's idle status and send VC_ACTION_NO_ACTIVE_TASK to client if engine is idle + * + * @return void + * @param[in] pcall_agent Pointer to the call agent structure + */ +static void __vc_core_check_engine_active_task(call_vc_callagent_state_t *pcall_agent); + +/** +* This function initializes the voicecall engine +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[out] pcall_agent_out Pointer to the address of call agent +* @param[in] pcallback_func Call back function +* @param[in] puser_data Data set by user +* @remarks pcall_agent_out and pcallback_func cannot be NULL. +* Output Parameter pcall_agent_out should be initialized to NULL +*/ +voicecall_error_t _vc_core_engine_init(voicecall_engine_t **pcall_agent_out, voicecall_cb pcallback_func, void *puser_data) +{ + call_vc_callagent_state_t *pcall_agent = NULL; + + CALL_ENG_DEBUG(ENG_DEBUG, "Voicecall Engine"); + + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent_out != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(*pcall_agent_out == NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*Initialize Call Agent*/ + pcall_agent = _vc_core_ca_init_agent(); + if (NULL == pcall_agent) { + return ERROR_VOICECALL_MEMALLOC_FAILURE; + } + + if (FALSE == __call_vc_subscribe_call_events(pcall_agent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Event Subscrition Failed"); + _vc_core_ca_finish_agent(pcall_agent); + return ERROR_VOICECALL_NOTI_FAILED; + } + /*Store the Callback Pointer*/ + pcall_agent->client_callback = pcallback_func; + pcall_agent->puser_data = puser_data; + + /*Calls to Tapi Should not be made in the application initialization, because this code will be executed if application is launched during + an incoming call also. so DBus Lock up can happen.*/ + gphone_init_finished = TRUE; + + /*Init Success, Assign Output Parameters*/ + *pcall_agent_out = (voicecall_engine_t *)pcall_agent; + + return ERROR_VOICECALL_NONE; +} + +void _vc_core_engine_handle_sat_events_cb(void *sat_setup_call_data, void *userdata) +{ + char *data = sat_setup_call_data; + + call_vc_callagent_state_t *pcall_agent = gpcall_agent_for_callback; + + CALL_ENG_DEBUG(ENG_DEBUG, "sat event callback."); + + memset(&gSatSetupCallInfo, 0, sizeof(TelSatSetupCallIndCallData_t)); + memcpy(&gSatSetupCallInfo, data, sizeof(TelSatSetupCallIndCallData_t)); + + gsat_event_type = SAT_RQST_SETUP_CALL; + gtype = TAPI_EVENT_SAT_SETUP_CALL_IND; + gpresult = &gSatSetupCallInfo; + g_idle_add(__call_vc_sat_idle_cb, pcall_agent); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call back Ends and returning.."); +} + +static void __call_vc_handle_sat_engine_events_cb(TelTapiEvent_t *event, void *userdata) +{ + call_vc_callagent_state_t *pcall_agent = gpcall_agent_for_callback; + + CALL_ENG_DEBUG(ENG_DEBUG, "sat event callback."); + + int event_type = event->EventType; + /*int status = event->Status;*/ + char *data = event->pData; + + switch (event_type) { + case TAPI_EVENT_SAT_SETUP_CALL_IND: + { + /*it will be processed in _vc_core_engine_handle_sat_events_cb().*/ + return; + } + break; + + case TAPI_EVENT_SAT_SEND_DTMF_IND: + { + memset(&gSatSendDtmfInfo, 0, sizeof(TelSatSendDtmfIndDtmfData_t)); + memcpy(&gSatSendDtmfInfo, data, sizeof(TelSatSendDtmfIndDtmfData_t)); + + gsat_event_type = SAT_RQST_SEND_DTMF; + gtype = event_type; + gpresult = &gSatSendDtmfInfo; + + g_idle_add(__call_vc_sat_idle_cb, pcall_agent); + } + break; + + case TAPI_EVENT_SAT_CALL_CONTROL_IND: + { + __call_vc_handle_sat_engine_events(pcall_agent, VC_ACTION_SAT_RESPONSE, SAT_RESP_SETUP_CALL, event_type, data); + } + break; + + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Default: event_type = %d", event_type); + break; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Call back Ends and returning.."); + + /*Send Process Termintate Event to the Client */ + if ((event_type == TAPI_EVENT_SAT_SETUP_CALL_IND) || (event_type == TAPI_EVENT_SAT_SEND_DTMF_IND)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Do not check an active task here"); + } else { + __vc_core_check_engine_active_task(pcall_agent); + } + +} + +/*Subscribe Noti Events*/ +static gboolean __call_vc_subscribe_call_events(call_vc_callagent_state_t *pcall_agent) +{ + clock_t start = 0; + clock_t end = 0; + + start = GET_CURR_TIME(); + + CALL_ENG_KPI("__call_vc_subscribe_tapi_event start"); + /* Subscribe Tapi Events */ + if (FALSE == __call_vc_subscribe_tapi_event(pcall_agent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Noti subscribe to Tapi Events failed"); + return FALSE; + + } + CALL_ENG_KPI("__call_vc_subscribe_tapi_event done"); + + end = GET_CURR_TIME(); + PRINT_DIFF_TIME(start, end, "Duration For tapi_call_subscription"); + + CALL_ENG_DEBUG(ENG_DEBUG, "Noti Subscription Sucess"); + return TRUE; +} + +/** + * This function sends response event to the registered client + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + * @param[in] event response event type + * @param[in] param1 param 1 to be passed to the client + * @param[in] param2 param 2 to be passed to the client + * @param[in] param3 param 3 to be passed to the client + */ +gboolean _vc_core_ca_send_event_to_client(call_vc_callagent_state_t *pcall_agent, int event, int param1, int param2, void *param3) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "Sending Event to Client"); + if (pcall_agent->client_callback != NULL) { + return pcall_agent->client_callback(event, param1, param2, param3, pcall_agent->puser_data); + } + return FALSE; +} + +static void __call_vc_tapi_initialized_cb(TelTapiEvent_t *event, void *userdata) +{ + call_vc_callagent_state_t *pagent = gpcall_agent_for_callback; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + TelSimCardStatus_t sim_status = 0; + TelSimCardType_t card_type = 0; + int sim_changed = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, "gphone_init_finished %d", gphone_init_finished); + + if (gphone_init_finished != TRUE) { + gphone_init_finished = TRUE; + + CALL_ENG_DEBUG(ENG_DEBUG, "Query Card Status .."); + + /*memset(&sim_status, 0, sizeof(sim_status));*/ + tapi_err = tel_get_sim_init_info(&sim_status, &sim_changed); + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tapi_sim_get_card_type failed.. tapi_err = %d", tapi_err); + pagent->bis_no_sim = TRUE; + } else { + tel_get_sim_type(&card_type); + pagent->card_type = card_type; + + CALL_ENG_DEBUG(ENG_DEBUG, "card_status = %d, card_type = %d", sim_status, pagent->card_type); + switch (sim_status) { + case TAPI_SIM_STATUS_CARD_NOT_PRESENT: /* = 0x01, /**< Card not present */ + case TAPI_SIM_STATUS_CARD_REMOVED: /* =0x0b, /**< Card removed **/ + pagent->bis_no_sim = TRUE; + break; + case TAPI_SIM_STATUS_CARD_ERROR: /* = 0x00, /**< Bad card / On the fly SIM gone bad **/ + case TAPI_SIM_STATUS_SIM_INITIALIZING: /* = 0x02, /**< Sim is Initializing state **/ + case TAPI_SIM_STATUS_SIM_INIT_COMPLETED: /* = 0x03, /**< Sim Initialization ok **/ + case TAPI_SIM_STATUS_SIM_PIN_REQUIRED: /* = 0x04, /**< PIN required state **/ + case TAPI_SIM_STATUS_SIM_PUK_REQUIRED: /* = 0x05, /**< PUK required state **/ + case TAPI_SIM_STATUS_CARD_BLOCKED: /* = 0x06, /**< PIN/PUK blocked(permanently blocked- All the attempts for PIN/PUK failed) **/ + case TAPI_SIM_STATUS_SIM_NCK_REQUIRED: /* = 0x07, /**< Network Control Key required state **/ + case TAPI_SIM_STATUS_SIM_NSCK_REQUIRED: /* = 0x08, /**< Network Subset Control Key required state **/ + case TAPI_SIM_STATUS_SIM_SPCK_REQUIRED: /* = 0x09, /**< Service Provider Control Key required state **/ + case TAPI_SIM_STATUS_SIM_CCK_REQUIRED: /* = 0x0a, /**< Corporate Control Key required state **/ + case TAPI_SIM_STATUS_SIM_LOCK_REQUIRED: + pagent->bis_no_sim = FALSE; + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Unknown Card_status = %d", sim_status); + pagent->bis_no_sim = TRUE; + break; + } + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "gphone_init_finished is TRUE."); + } + + /*As a Backup, whenever this event is arrived, just update this variable*/ + gphone_init_finished = TRUE; +} + +static gboolean __call_vc_subscribe_tapi_event(call_vc_callagent_state_t *pcall_agent) +{ + int index = 0; + + TapiResult_t api_err = TAPI_API_SUCCESS; + int num_event = 0; + + if (tel_init() == TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_init() success."); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_init() failed."); + return FALSE; + } + + int call_event_list[] = { + TAPI_EVENT_CALL_SETUP_CNF, + TAPI_EVENT_CALL_ALERT_IND, + TAPI_EVENT_CALL_CONNECTED_IND, + TAPI_EVENT_CALL_INCOM_IND, + TAPI_EVENT_CALL_ANSWER_CNF, + TAPI_EVENT_CALL_RETRIEVE_CNF, + TAPI_EVENT_CALL_RETRIEVE_IND, + TAPI_EVENT_CALL_HOLD_IND, + TAPI_EVENT_CALL_HOLD_CNF, + TAPI_EVENT_CALL_TRANSFER_CNF, + TAPI_EVENT_CALL_TRANSFER_IND, + TAPI_EVENT_CALL_SETUPCONFERENCE_CNF, + TAPI_EVENT_CALL_SETUPCONFERENCE_IND, + TAPI_EVENT_CALL_SPLITCONFERENCE_CNF, + TAPI_EVENT_CALL_SEND_DTMF_CNF, + TAPI_EVENT_CALL_WAITING_IND, + TAPI_EVENT_CALL_FORWARD_IND, + TAPI_EVENT_CALL_RELEASE_CNF, + TAPI_EVENT_CALL_RELEASE_ALL_CNF, + TAPI_EVENT_CALL_RELEASE_ALL_ACTIVE_CNF, + TAPI_EVENT_CALL_RELEASE_ALL_HELD_CNF, + TAPI_EVENT_CALL_END_IND, + TAPI_EVENT_CALL_BARRING_IND, + TAPI_EVENT_CALL_CUGINFO_IND, + TAPI_EVENT_CALL_AOCINFO_IND, + TAPI_EVENT_CALL_CALLINGNAMEINFO_IND, + TAPI_EVENT_CALL_CONNECTEDNUMBERINFO_IND, + TAPI_EVENT_CALL_CLISUPRESSIONREJ_IND, + TAPI_EVENT_CALL_DEFLECTED_IND, + TAPI_EVENT_CALL_UNCOND_FORWARDING_IND, + TAPI_EVENT_CALL_COND_FORWARDING_IND, + + TAPI_EVENT_SS_AOC_RSP, + + TAPI_EVENT_SOUND_VOLUMECTRL_RSP, /*CALL_VC_TAPI_CALL_EVENT_MAX_NUM : 33*/ + }; + num_event = sizeof(call_event_list) / sizeof(int); + for (index = 0; index < num_event; index++) { + api_err = tel_register_event(call_event_list[index], &pcall_agent->subscription_id[index], (TelAppCallback) & __call_vc_handle_tapi_events, NULL); + if (api_err != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_register_event() failed.. event id:[%d], api_err:[%d]", call_event_list[index], api_err); + return FALSE; + } + } + + int ready_event_list[] = { + TAPI_EVENT_POWER_SERVICE_READY_IND, /*CALL_VC_TAPI_READY_EVENT_NUM 1*/ + }; + num_event = sizeof(ready_event_list) / sizeof(int); + for (index = 0; index < num_event; index++) { + api_err = tel_register_event(ready_event_list[index], &pcall_agent->subscription_id[index + CALL_VC_TAPI_CALL_EVENT_MAX_NUM], (TelAppCallback) & __call_vc_tapi_initialized_cb, NULL); + if (api_err != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_register_event() failed.. event id:[%d], api_err:[%d]", ready_event_list[index], api_err); + return FALSE; + } + } + + int sat_event_list[] = { + TAPI_EVENT_SAT_SETUP_CALL_IND, + TAPI_EVENT_SAT_CALL_CONTROL_IND, + TAPI_EVENT_SAT_SEND_DTMF_IND, /*CALL_VC_SIMATK_EVENT_MAX_NUM : 3*/ + }; + num_event = sizeof(sat_event_list) / sizeof(int); + for (index = 0; index < num_event; index++) { + api_err = tel_register_event(sat_event_list[index], &pcall_agent->subscription_id[index + CALL_VC_TAPI_CALL_EVENT_MAX_NUM + CALL_VC_TAPI_READY_EVENT_NUM], (TelAppCallback) & __call_vc_handle_sat_engine_events_cb, NULL); + if (api_err != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_register_event() failed.. event id:[%d], api_err:[%d]", sat_event_list[index], api_err); + return FALSE; + } + } + + if (tel_register_app_name("org.tizen.voicecall") != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_register_app_name() failed"); + } + + gpcall_agent_for_callback = pcall_agent; + + CALL_ENG_DEBUG(ENG_DEBUG, "Subscribe to TAPI Success"); + + return TRUE; + +} + +static gboolean __call_vc_create_outgoing_callinfo(call_vc_callagent_state_t *pagent, voicecall_setup_info_t *psetup_call_info, call_vc_call_objectinfo_t *pcall_object, int *error_code) +{ + char call_number[VC_PHONE_NUMBER_LENGTH_MAX] = { 0, }; + + CALL_ENG_DEBUG(ENG_DEBUG, "call_type=%d", psetup_call_info->call_type); + + _vc_core_cm_clear_call_object(pcall_object); + + /*Initialize following Call Agents state to defaults.*/ + pagent->bonly_sos_call = FALSE; + + /*Update CallObjects state to Prepare Outgoing*/ + pcall_object->state = VC_CALL_STATE_PREPARE_OUTGOING; + + /*Update Call|Objects Call Type*/ + pcall_object->call_type = psetup_call_info->call_type; + + /*Update Call Objects Identity*/ + pcall_object->identity_mode = psetup_call_info->identity_mode; + + /*Differentiate the call by its source of origination*/ + switch (pcall_object->call_type) { + case VC_CALL_ORIG_TYPE_EMERGENCY: + { + pagent->bonly_sos_call = TRUE; + pcall_object->bemergency_number = TRUE; +/*PDIAL_SEND_DTMF*/ + _vc_core_util_strcpy(pcall_object->source_tel_number, sizeof(pcall_object->source_tel_number), psetup_call_info->source_tel_number); +/*PDIAL_SEND_DTMF*/ + _vc_core_util_strcpy(pcall_object->tel_number, sizeof(pcall_object->tel_number), psetup_call_info->tel_number); + return TRUE; + } + break; + case VC_CALL_ORIG_TYPE_PINLOCK: + { + CALL_ENG_DEBUG(ENG_DEBUG, "PIN LOCK!!!!"); + pagent->bonly_sos_call = TRUE; +/*PDIAL_SEND_DTMF*/ + _vc_core_util_strcpy(pcall_object->source_tel_number, sizeof(pcall_object->source_tel_number), psetup_call_info->source_tel_number); +/*PDIAL_SEND_DTMF*/ + _vc_core_util_strcpy(pcall_object->tel_number, sizeof(pcall_object->tel_number), psetup_call_info->tel_number); + } + break; + case VC_CALL_ORIG_TYPE_NOSIM: /*no sim (pagent->bis_no_sim == TRUE)*/ + { + pagent->bonly_sos_call = TRUE; +/*PDIAL_SEND_DTMF*/ + _vc_core_util_strcpy(pcall_object->source_tel_number, sizeof(pcall_object->source_tel_number), psetup_call_info->source_tel_number); +/*PDIAL_SEND_DTMF*/ + _vc_core_util_strcpy(pcall_object->tel_number, sizeof(pcall_object->tel_number), psetup_call_info->tel_number); + } + break; + case VC_CALL_ORIG_TYPE_NORMAL: + case VC_CALL_ORIG_TYPE_SAT: + { +/*PDIAL_SEND_DTMF*/ + _vc_core_util_strcpy(pcall_object->source_tel_number, sizeof(pcall_object->source_tel_number), psetup_call_info->source_tel_number); +/*PDIAL_SEND_DTMF*/ + _vc_core_util_strcpy(pcall_object->tel_number, sizeof(pcall_object->tel_number), psetup_call_info->tel_number); + } + break; + case VC_CALL_ORIG_TYPE_VOICEMAIL: + { +/*PDIAL_SEND_DTMF*/ + _vc_core_util_strcpy(pcall_object->source_tel_number, sizeof(pcall_object->source_tel_number), psetup_call_info->source_tel_number); +/*PDIAL_SEND_DTMF*/ + _vc_core_util_strcpy(pcall_object->tel_number, sizeof(pcall_object->tel_number), psetup_call_info->tel_number); + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Invalide Call Type: %d", pcall_object->call_type); + *error_code = ERROR_VOICECALL_INVALID_CALL_TYPE; + return FALSE; + } + + /*Copy CUG Details */ + memcpy(&pcall_object->cug_info, &psetup_call_info->cug_info, sizeof(voicecall_cug_info_t)); + + /*Check for Emergency Number */ + _vc_core_util_extract_call_number(pcall_object->tel_number, call_number, sizeof(call_number)); + pcall_object->bemergency_number = _vc_core_util_check_emergency_number(pagent->card_type, call_number, pagent->bis_no_sim, &pcall_object->ecc_category); + + CALL_ENG_DEBUG(ENG_DEBUG, "no_sim=%d, emergency_number=%d", pagent->bis_no_sim, pcall_object->bemergency_number); + + if (VC_CALL_ORIG_TYPE_PINLOCK == pcall_object->call_type && pcall_object->bemergency_number == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "PIN/PUK Lock and number is no emergency number, call cannot be made"); + *error_code = ERROR_VOICECALL_EMERGENCY_CALLS_ONLY; + return FALSE; + } + + if (pagent->bis_no_sim == TRUE && pcall_object->bemergency_number == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Sim Not available and number is no emergency number, call cannot be made"); + *error_code = ERROR_VOICECALL_CALL_IMPOSSIBLE_NOSIM_NOEMERGNUM; + return FALSE; + } + + if (TRUE == pcall_object->bemergency_number) { + CALL_ENG_DEBUG(ENG_DEBUG, "Number is Emergency Number, Change call type to emergency"); + psetup_call_info->call_type = pcall_object->call_type = VC_CALL_ORIG_TYPE_EMERGENCY; + psetup_call_info->ecc_category = pcall_object->ecc_category; + } + + return TRUE; +} + +static gboolean __call_vc_request_sat_call(call_vc_callagent_state_t *pagent, int mo_call_index, int *ret_code) +{ + call_vc_call_objectinfo_t callInfo; + TelSatCmdQualiSetupCall_t sat_request_type = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, "mo_call_index = %d", mo_call_index); + + VOICECALL_RETURN_FALSE_IF_FAIL(pagent->call_manager.setupcall_info.mocall_index == mo_call_index); + + if (FALSE == _vc_core_cm_get_outgoing_call_info(&pagent->call_manager, &callInfo)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call info does not exist!"); + *ret_code = ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + return FALSE; + } + + sat_request_type = pagent->call_manager.setupcall_info.satcall_setup_info.satengine_setupcall_data.calltype; + + CALL_ENG_DEBUG(ENG_DEBUG, " SAT_CALL sat_request_type=%d", sat_request_type); + + switch (sat_request_type) { + case TAPI_SAT_SETUP_CALL_IF_ANOTHER_CALL_NOT_BUSY_WITH_REDIAL: + { + pagent->call_manager.setupcall_info.satcall_setup_info.redial = TRUE; + } + case TAPI_SAT_SETUP_CALL_IF_ANOTHER_CALL_NOT_BUSY: /*Fall Through*/ + { + /* one is the call set up by SAT, so more than 1 means another call exists */ + if (_vc_core_cm_get_call_member_count(&pagent->call_manager) > 1) { + /* voice call agent is busy */ + CALL_ENG_DEBUG(ENG_DEBUG, "Call Exists, SAT call connot be continued"); + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SETUP_CALL, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + *ret_code = ERROR_VOICECALL_CALL_NOT_ALLOWED; + return FALSE; + } + + _vc_core_cm_set_outgoing_call_info(&pagent->call_manager, &callInfo); + + if (_vc_core_tapi_rqst_prepare_setup_call(pagent) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "SAT_CALL fail to setup call"); + _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SETUP_CALL, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_OUTGOING_ABORTED); + *ret_code = ERROR_VOICECALL_TAPI_CAUSE_CALL_FAILED; + return FALSE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Prepare Setup Call Success"); + } + } + break; + case TAPI_SAT_SETUP_CALL_PUT_ALL_OTHER_CALLS_ON_HOLD_WITH_REDIAL: + { + pagent->call_manager.setupcall_info.satcall_setup_info.redial = TRUE; + } + case TAPI_SAT_SETUP_CALL_PUT_ALL_OTHER_CALLS_ON_HOLD: /*Fall Through*/ + { + if (_vc_core_cm_isexists_active_call(&pagent->call_manager) && _vc_core_cm_isexists_held_call(&pagent->call_manager)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Both Activee & Hld call exists, SAT Call cannot be continued"); + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SETUP_CALL, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + *ret_code = ERROR_VOICECALL_CALL_NOT_ALLOWED; + return FALSE; + } + if (_vc_core_cm_isexists_connected_call(&pagent->call_manager)) { + if (FALSE == _vc_core_tapi_rqst_prepare_setup_call(pagent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "SAT_CALL hold fail"); + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SETUP_CALL, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_OUTGOING_ABORTED); + *ret_code = ERROR_VOICECALL_TAPI_CAUSE_CALL_FAILED; + return FALSE; + } + } else { + /*If no other calls to hold, setup the call directly */ + if (FALSE == _vc_core_tapi_rqst_setup_call(pagent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "SAT_CALL fail to setup call"); + _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SETUP_CALL, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_OUTGOING_ABORTED); + *ret_code = ERROR_VOICECALL_TAPI_CAUSE_CALL_FAILED; + return FALSE; + } + } + } + break; + case TAPI_SAT_SETUP_CALL_DISCONN_ALL_OTHER_CALLS_WITH_REDIAL: + { + pagent->call_manager.setupcall_info.satcall_setup_info.redial = TRUE; + } + case TAPI_SAT_SETUP_CALL_DISCONN_ALL_OTHER_CALLS: /*Fall Through*/ + { + if (_vc_core_cm_isexists_active_call(&pagent->call_manager) || _vc_core_cm_isexists_held_call(&pagent->call_manager)) { + /*Disconnect all calls and setup call */ + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SETUP); + _vc_core_tapi_rqst_release_all_calls(pagent); + } else { + if (FALSE == _vc_core_tapi_rqst_prepare_setup_call(pagent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "SAT_CALL fail to setup call"); + _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SETUP_CALL, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_OUTGOING_ABORTED); + *ret_code = ERROR_VOICECALL_TAPI_CAUSE_CALL_FAILED; + return FALSE; + } + } + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Action not defined for this SAT Request Type"); + return FALSE; + } + + return TRUE; +} + +static gboolean __call_vc_request_call(call_vc_callagent_state_t *pagent, int mo_call_index, int *ret_code) +{ + call_vc_call_objectinfo_t callInfo; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + VOICECALL_RETURN_FALSE_IF_FAIL(pagent->call_manager.setupcall_info.mocall_index == mo_call_index); + + _vc_core_cm_clear_call_object(&callInfo); + if (_vc_core_cm_get_outgoing_call_info(&pagent->call_manager, &callInfo) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call info does not exist!"); + *ret_code = ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + return FALSE; + } + /*Switch according to the CallType requested*/ + switch (callInfo.call_type) { + case VC_CALL_ORIG_TYPE_NORMAL: + case VC_CALL_ORIG_TYPE_EMERGENCY: + case VC_CALL_ORIG_TYPE_NOSIM: + case VC_CALL_ORIG_TYPE_SAT: + case VC_CALL_ORIG_TYPE_PINLOCK: + + /*Set the updated Object Info to the Call Manager*/ + _vc_core_cm_set_outgoing_call_info(&pagent->call_manager, &callInfo); + + if (_vc_core_tapi_rqst_prepare_setup_call(pagent) == FALSE) { + _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_OUTGOING_ABORTED); + *ret_code = ERROR_VOICECALL_TAPI_CAUSE_CALL_FAILED; + CALL_ENG_DEBUG(ENG_DEBUG, "Prepare Setup Call Failed"); + + return FALSE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Prepare Setup Call Success"); + } + + break; + default: + *ret_code = ERROR_VOICECALL_INVALID_CALL_TYPE; + CALL_ENG_DEBUG(ENG_DEBUG, "Not defined call type=%d", pagent->call_manager.setupcall_info.call_type); + return FALSE; + break; + } + + return TRUE; +} + +/** +* This function prepares the call setup info structure for making call + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] psetup_call_info Pointer to the call setup info structure. +* @remarks pvoicecall_agent and psetup_call_info cannot be NULL +* Only on successfull completion of this API, _vc_core_engine_make_call can be made +* @see See following API's also +* -_vc_core_engine_make_call +* -voicecall_clear_prepared_call +* + */ +voicecall_error_t _vc_core_engine_prepare_call(voicecall_engine_t *pvoicecall_agent, voicecall_setup_info_t *psetup_call_info) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_call_objectinfo_t callobject_info; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + TelSimCardStatus_t sim_status; + TelSimCardType_t card_type = 0; + int sim_changed = 0; + gboolean status = FALSE; + int nIndex = 0; + int error_code = 0; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(psetup_call_info != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + if (FALSE == _vc_core_util_isvalid_telephone_number(psetup_call_info->tel_number)) { + return ERROR_VOICECALL_INVALID_TELEPHONE_NUMBER; + } + + CALL_ENG_KPI("tel_check_service_ready start"); + tapi_err = tel_check_service_ready(&status); + CALL_ENG_KPI("tel_check_service_ready done"); + if (TAPI_API_SUCCESS != tapi_err || FALSE == status) { + CALL_ENG_DEBUG(ENG_DEBUG, "Tapi not initialized"); + return ERROR_VOICECALL_PHONE_NOT_INITIALIZED; + } + /*Check the Call Engines IO State*/ + if (pagent->io_state != VC_INOUT_STATE_NONE && pagent->io_state != VC_INOUT_STATE_OUTGOING_SHOW_RETRY_CALLBOX) { + CALL_ENG_DEBUG(ENG_DEBUG, "pagent->io_state != VC_INOUT_STATE_NONE..io_state=%d", pagent->io_state); + return ERROR_VOICECALL_ENGINE_STATE_NOT_NONE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Checking for SIM Availablity"); + + /*memset(&sim_status, 0, sizeof(sim_status));*/ + CALL_ENG_KPI("tel_get_sim_init_info start"); + tapi_err = tel_get_sim_init_info(&sim_status, &sim_changed); + CALL_ENG_KPI("tel_get_sim_init_info done"); + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_get_sim_init_info failed.. tapi_err = %d", tapi_err); + + pagent->bis_no_sim = TRUE; + psetup_call_info->call_type = VC_CALL_ORIG_TYPE_NOSIM; + } else { + CALL_ENG_KPI("tel_get_sim_type start"); + tel_get_sim_type(&card_type); + CALL_ENG_KPI("tel_get_sim_type done"); + pagent->card_type = card_type; + + CALL_ENG_DEBUG(ENG_DEBUG, "card_status = %d, card_type = %d", sim_status, pagent->card_type); + switch (sim_status) { + case TAPI_SIM_STATUS_CARD_NOT_PRESENT: /* = 0x01, /**< Card not present **/ + case TAPI_SIM_STATUS_CARD_REMOVED: /* =0x0b, /**< Card removed **/ + pagent->bis_no_sim = TRUE; + break; + case TAPI_SIM_STATUS_CARD_ERROR: /* = 0x00, /**< Bad card / On the fly SIM gone bad **/ + case TAPI_SIM_STATUS_SIM_INITIALIZING: /* = 0x02, /**< Sim is Initializing state **/ + case TAPI_SIM_STATUS_SIM_INIT_COMPLETED: /* = 0x03, /**< Sim Initialization ok **/ + case TAPI_SIM_STATUS_SIM_PIN_REQUIRED: /* = 0x04, /**< PIN required state **/ + case TAPI_SIM_STATUS_SIM_PUK_REQUIRED: /* = 0x05, /**< PUK required state **/ + case TAPI_SIM_STATUS_CARD_BLOCKED: /* = 0x06, /**< PIN/PUK blocked(permanently blocked- All the attempts for PIN/PUK failed) **/ + case TAPI_SIM_STATUS_SIM_NCK_REQUIRED: /* = 0x07, /**< Network Control Key required state **/ + case TAPI_SIM_STATUS_SIM_NSCK_REQUIRED: /* = 0x08, /**< Network Subset Control Key required state **/ + case TAPI_SIM_STATUS_SIM_SPCK_REQUIRED: /* = 0x09, /**< Service Provider Control Key required state **/ + case TAPI_SIM_STATUS_SIM_CCK_REQUIRED: /* = 0x0a, /**< Corporate Control Key required state **/ + case TAPI_SIM_STATUS_SIM_LOCK_REQUIRED: + pagent->bis_no_sim = FALSE; + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Unknown Card_status = %d", sim_status); + pagent->bis_no_sim = TRUE; + break; + } + } + + /*Prepare Outgoing Call Info*/ + _vc_core_cm_clear_call_object(&callobject_info); + if (__call_vc_create_outgoing_callinfo(pagent, psetup_call_info, &callobject_info, &error_code) == FALSE) { + return error_code; + } + + /* Check for MO Call Possiblity */ + if (_vc_core_ca_is_mocall_possible(pagent, callobject_info.bemergency_number) == FALSE) { + return ERROR_VOICECALL_CALL_NOT_ALLOWED; + } + + /* Add the prepared call object to the CallManager */ + nIndex = _vc_core_cm_add_call_object(&pagent->call_manager, &callobject_info); + if (nIndex != -1) { + /*If there is a previously made MO Call, clear that before setting the new mo call */ + _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + _vc_core_cm_set_outgoing_call(&pagent->call_manager, nIndex); + psetup_call_info->mo_call_index = nIndex; + } else { + return ERROR_VOICECALL_CALL_NOT_ALLOWED; + } + + return ERROR_VOICECALL_NONE; +} + +/** +* This function clears the data of the given call type. +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_type call type +* @param[in] call_handle Call handle of the connected call to be cleared +* @remarks This will clear the call data only when the call data are currently not being used +* i,e) the data will be cleared only if the corresponding call is ended or the call data is not used at all. +* call_handle argument is required only in case of connected call, Engine ignores call_handle for other +* call types. +*/ +voicecall_error_t _vc_core_engine_finalize_call(voicecall_engine_t *pvoicecall_agent, voicecall_call_type_t call_type, int call_handle) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + gboolean bret_val = FALSE; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + CALL_ENG_DEBUG(ENG_DEBUG, "call_type = %d", call_type); + + switch (call_type) { + case VC_OUTGOING_CALL: + { + if ((VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED == pagent->io_state) || (VC_INOUT_STATE_OUTGOING_WAIT_ORIG == pagent->io_state) || (VC_INOUT_STATE_OUTGOING_WAIT_ALERT == pagent->io_state)) { + return ERROR_VOICECALL_CALL_IS_IN_PROGRESS; + } + + bret_val = _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + } + break; + case VC_CONNECTED_CALL: + { + call_vc_call_objectinfo_t call_object; + + if (TRUE == _vc_core_cm_get_call_object(&pagent->call_manager, call_handle, &call_object)) { + if (VC_CALL_STATE_ENDED == call_object.state) { + bret_val = _vc_core_ca_clear_connected_call(pagent, call_handle); + } else { + return ERROR_VOICECALL_CALL_IS_IN_PROGRESS; + } + } + } + break; + case VC_INCOMING_CALL: + { + return ERROR_VOICECALL_NOT_SUPPORTED; + } + break; + default: + return ERROR_VOICECALL_INVALID_CALL_TYPE; + } + + return (TRUE == bret_val) ? ERROR_VOICECALL_NONE : ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; +} + +/** +* This function establishes an outgoing call with the details prepared using _vc_core_engine_prepare_call +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] mo_call_index Index of the prepare mo call +* @param[out] pcall_handle Handle of the MO Call Made +* @remarks pvoicecall_agent and pcall_handle cannot be NULL +* @see _vc_core_engine_end_call +*/ +voicecall_error_t _vc_core_engine_make_call(voicecall_engine_t *pvoicecall_agent, int mo_call_index, int *pcall_handle) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + gboolean ret_val = FALSE; + call_vc_call_objectinfo_t call_object; + int error_code = ERROR_VOICECALL_NONE; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(mo_call_index >= 0 && mo_call_index <= 7, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_handle != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + CALL_ENG_DEBUG(ENG_DEBUG, "..."); + + _vc_core_cm_clear_call_object(&call_object); + if (_vc_core_cm_get_outgoing_call_info(&pagent->call_manager, &call_object) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call info does not exist!"); + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + } + + if (VC_CALL_ORIG_TYPE_SAT == call_object.call_type) { + ret_val = __call_vc_request_sat_call(pagent, mo_call_index, &error_code); + } else { + ret_val = __call_vc_request_call(pagent, mo_call_index, &error_code); + } + + if ((TRUE == ret_val) && (pagent->io_state == VC_INOUT_STATE_OUTGOING_WAIT_ALERT || pagent->io_state == VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED || pagent->io_state == VC_INOUT_STATE_OUTGOING_WAIT_ORIG)) { + *pcall_handle = _vc_core_cm_get_outgoing_call_handle(&pagent->call_manager); + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call Handle: %d", *pcall_handle); + + } + + return (TRUE == ret_val) ? ERROR_VOICECALL_NONE : error_code; +} + +static gboolean __call_vc_handle_sat_engine_events(call_vc_callagent_state_t *pcall_agent, int sat_event, int sat_event_type, int type, void *result) +{ + call_vc_callagent_state_t *pagent = pcall_agent; + call_vc_satsetup_info_t *psatsetup_info = NULL; + voicecall_sat_callinfo_t call_vc_sat_callinfo; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "sat_event: %d, sat_event_type: %d, command_type: %d", sat_event, sat_event_type, type); + + psatsetup_info = (call_vc_satsetup_info_t *) &(pagent->call_manager.setupcall_info.satcall_setup_info); + + switch (sat_event) { + case VC_ACTION_SAT_REQUEST: + { + switch (sat_event_type) { + case SAT_RQST_SETUP_CALL: + { + CALL_ENG_DEBUG(ENG_DEBUG, "SAT_RQST_SETUP_CALL SAT Event is recieved..."); + + if ((pagent->io_state != VC_INOUT_STATE_NONE) || (pagent->callagent_state != CALL_VC_CA_STATE_NORMAL)) { + CALL_ENG_DEBUG(ENG_DEBUG, "SAT_CALL unable to process command!"); + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SETUP_CALL, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + return FALSE; + } + + /*Initialize Call Setup Data */ + psatsetup_info->psat_rgb_data = NULL; + memset(&(psatsetup_info->satengine_setupcall_data), 0, sizeof(TelSatSetupCallIndCallData_t)); + memcpy(&(psatsetup_info->satengine_setupcall_data), result, sizeof(TelSatSetupCallIndCallData_t)); + psatsetup_info->satengine_event_type = type; + memset(&call_vc_sat_callinfo, 0, sizeof(voicecall_sat_callinfo_t)); + + _vc_core_util_strcpy(call_vc_sat_callinfo.call_number, sizeof(call_vc_sat_callinfo.call_number), (char *)psatsetup_info->satengine_setupcall_data.callNumber.string); + _vc_core_util_strcpy(call_vc_sat_callinfo.disp_text, sizeof(call_vc_sat_callinfo.disp_text), (char *)psatsetup_info->satengine_setupcall_data.dispText.string); + call_vc_sat_callinfo.duration = psatsetup_info->satengine_setupcall_data.duration; + if (call_vc_sat_callinfo.duration > 0) { + psatsetup_info->bduration = TRUE; + + /*Store the duration, this remaining duration will be reduced in subsequent redial attempts */ + psatsetup_info->remaining_duration = call_vc_sat_callinfo.duration; + } + CALL_ENG_DEBUG(ENG_DEBUG, "Voice call set up request sent to voice call application psatsetup_info->bduration = %d", psatsetup_info->bduration); + CALL_ENG_DEBUG(ENG_DEBUG, "psatsetup_info->remaining_duration = %lu", psatsetup_info->remaining_duration); + CALL_ENG_DEBUG(ENG_DEBUG, "sat call type = %d", psatsetup_info->satengine_setupcall_data.calltype); + + _vc_core_ca_send_event_to_client(pagent, VC_ACTION_SAT_REQUEST, SAT_RQST_SETUP_CALL, 0, &call_vc_sat_callinfo); + } + break; + case SAT_RQST_SEND_DTMF: + { + memset(&(psatsetup_info->satengine_dtmf_data), 0, sizeof(TelSatSendDtmfIndDtmfData_t)); + memcpy(&(psatsetup_info->satengine_dtmf_data), result, sizeof(TelSatSendDtmfIndDtmfData_t)); + psatsetup_info->satengine_event_type = type; + + if (FALSE == __vc_core_is_dtmf_possible(pagent)) { + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SEND_DTMF, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + } else { + memset(&call_vc_sat_callinfo, 0, sizeof(voicecall_sat_callinfo_t)); + + _vc_core_util_strcpy(call_vc_sat_callinfo.call_number, sizeof(call_vc_sat_callinfo.call_number), (char *)psatsetup_info->satengine_dtmf_data.dtmfString.string); + call_vc_sat_callinfo.bsat_hidden = psatsetup_info->satengine_dtmf_data.bIsHiddenMode; + _vc_core_ca_send_event_to_client(pagent, VC_ACTION_SAT_REQUEST, SAT_RQST_SEND_DTMF, 0, &call_vc_sat_callinfo); + } + } + break; + } + } + break; + case VC_ACTION_SAT_RESPONSE: + { + call_vc_call_objectinfo_t objectInfo; + switch (sat_event_type) { + case SAT_RESP_SETUP_CALL: + { + if (_vc_core_cm_get_outgoing_call_info(&pagent->call_manager, &objectInfo) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "SAT_CALL_CONTROL Outgoing call info does not exist.."); + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_NONE); + break; + } + memset(&(psatsetup_info->satengine_callctrl_data), 0, sizeof(psatsetup_info->satengine_callctrl_data)); + memcpy(&(psatsetup_info->satengine_callctrl_data), result, sizeof(psatsetup_info->satengine_callctrl_data)); + + switch (psatsetup_info->satengine_callctrl_data.callCtrlResult) { + case TAPI_SAT_CALL_CTRL_R_ALLOWED_NO_MOD: + { + CALL_ENG_DEBUG(ENG_DEBUG, "ret=TAPI_SAT_CALL_CTRL_R_ALLOWED_NO_MOD"); + pagent->call_manager.setupcall_info.call_control_type = CALL_VC_SAT_CC_ALLOWED; + } + break; + case TAPI_SAT_CALL_CTRL_R_NOT_ALLOWED: + { + CALL_ENG_DEBUG(ENG_DEBUG, "ret=TAPI_SAT_CALL_CTRL_R_NOT_ALLOWED"); + pagent->call_manager.setupcall_info.call_control_type = CALL_VC_SAT_CC_NOT_ALLOWED; + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_NONE); + + if (objectInfo.call_type == VC_CALL_ORIG_TYPE_SAT) { + _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SETUP_CALL, CALL_VC_ME_CONTROL_PERMANENT_PROBLEM); + } else { + _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + } + + memset(&call_vc_sat_callinfo, 0, sizeof(voicecall_sat_callinfo_t)); + call_vc_sat_callinfo.sat_mo_call_ctrl_res = CALL_NOT_ALLOWED; + _vc_core_ca_send_event_to_client(pagent, VC_ACTION_SAT_RESPONSE, SAT_RESP_SETUP_CALL, 0, &call_vc_sat_callinfo); + } + break; + case TAPI_SAT_CALL_CTRL_R_ALLOWED_WITH_MOD: + { + gboolean bsscode = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, "ret=TAPI_SAT_CALL_CTRL_R_ALLOWED_WITH_MOD"); + pagent->call_manager.setupcall_info.call_control_type = CALL_VC_SAT_CC_ALLOWED_WITH_MODIFIED; + + memset(objectInfo.connected_telnumber, 0, sizeof(objectInfo.connected_telnumber)); + memset(objectInfo.connected_name, 0, sizeof(objectInfo.connected_name)); + + _vc_core_util_strcpy(objectInfo.connected_telnumber, sizeof(objectInfo.connected_telnumber), (char *)psatsetup_info->satengine_callctrl_data.u.callCtrlCnfCallData.address.string); + _vc_core_util_strcpy(objectInfo.connected_name, sizeof(objectInfo.connected_name), (char *)psatsetup_info->satengine_callctrl_data.dispData.string); + + /*Prepare the data to be sent to the client */ + memset(&call_vc_sat_callinfo, 0, sizeof(voicecall_sat_callinfo_t)); + _vc_core_util_strcpy(call_vc_sat_callinfo.call_number, sizeof(call_vc_sat_callinfo.call_number), objectInfo.connected_telnumber); + _vc_core_util_strcpy(call_vc_sat_callinfo.disp_text, sizeof(call_vc_sat_callinfo.disp_text), objectInfo.connected_name); + + /* when call number is changed as SS string */ + _vc_core_engine_status_isvalid_ss_code((voicecall_engine_t *)pcall_agent, objectInfo.connected_telnumber, &bsscode); + if (TRUE == bsscode) { + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_NONE); + + call_vc_sat_callinfo.sat_mo_call_ctrl_res = CALL_CHANGED_TO_SS; + CALL_ENG_DEBUG(ENG_DEBUG, "VC Call Control Response Event: %d", call_vc_sat_callinfo.sat_mo_call_ctrl_res); + } else { + objectInfo.bemergency_number = _vc_core_util_check_emergency_number(pagent->card_type, objectInfo.connected_telnumber, pagent->bis_no_sim, &objectInfo.ecc_category); + _vc_core_cm_set_outgoing_call_info(&pagent->call_manager, &objectInfo); + + call_vc_sat_callinfo.duration = psatsetup_info->satengine_setupcall_data.duration; + call_vc_sat_callinfo.sat_mo_call_ctrl_res = CALL_ALLOWED_WITH_MOD; + CALL_ENG_DEBUG(ENG_DEBUG, "VC Call Control Response Event: %d", call_vc_sat_callinfo.sat_mo_call_ctrl_res); + } + + /*Send the Call Control response event to the client */ + _vc_core_ca_send_event_to_client(pagent, VC_ACTION_SAT_RESPONSE, SAT_RESP_SETUP_CALL, 0, &call_vc_sat_callinfo); + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "SAT_CALL_CONTROL - not defined return code"); + break; + } + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Invalid Sat Event Type"); + break; + } + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Invalid SAT Event"); + return FALSE; + } + return TRUE; +} + +static gboolean __call_vc_incoming_idle_cb(gpointer puser_data) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)puser_data; + call_vc_call_objectinfo_t callobject_info; + + CALL_ENG_DEBUG(ENG_DEBUG, "Handling Incoming call in Idle Callback"); + + if (FALSE == _vc_core_cm_get_incoming_call_info(&pagent->call_manager, &callobject_info)) { + CALL_ENG_DEBUG(ENG_ERR, "Incoming Call Info not available"); + return FALSE; + } + + /*If the Incoming End event arrived before processing the Incoming request, then donot change the state to Incombox */ + if (pagent->io_state != VC_INOUT_STATE_INCOME_END) { + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_INCOME_BOX); + } + + /* Send Incoming Call Event to Client */ + /*_vc_core_ca_send_event_to_client(pagent, VC_CALL_INCOM, callobject_info.call_handle, callobject_info.bincoming_call_is_fwded, callobject_info.tel_number);*/ + _vc_core_ca_send_event_to_client(pagent, VC_CALL_INCOM, callobject_info.call_handle, 0, callobject_info.tel_number); + + /* Reset Incoming Call Details */ + gincoming_call_handle = VC_TAPI_INVALID_CALLHANDLE; + memset(&gincoming_call_info, 0, sizeof(TelCallIncomingCallInfo_t)); + + /*Check whether the incoming call is accepted or rejected by + cheking the Incoming callobjects status */ + if (_vc_core_cm_get_call_state(&pagent->call_manager, callobject_info.call_handle) != VC_CALL_STATE_INCOME) { + CALL_ENG_DEBUG(ENG_DEBUG, "[Call :%d] not in VC_CALL_STATE_INCOME state", callobject_info.call_handle); + return FALSE; + } + + /*Always Return FALSE from this g_idle callback, so it will not be called again */ + return FALSE; +} + +/*Rejects the call, only if the call state is in rejected state*/ +static gboolean __call_vc_reject_call_full_idle_cb(gpointer puser_data) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)puser_data; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + int pReqId = VC_RQSTID_DEFAULT; + call_vc_call_objectinfo_t call_object; + + CALL_ENG_DEBUG(ENG_DEBUG, "Rejecting the [Call:%d] in IDLE CB", gincoming_call_handle); + + if (gincoming_call_handle != -1) { + _vc_core_cm_get_call_object(&pcall_agent->call_manager, gincoming_call_handle, &call_object); + + if (VC_CALL_STATE_REJECTED == call_object.state) { + /*Answer the incoming call by accepting or rejecting the call */ + tapi_err = tel_answer_call(gincoming_call_handle, TAPI_CALL_ANSWER_REJECT, &pReqId); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_ERR, "tel_answer_call failed, Error: %d", tapi_err); + } + + gincoming_call_handle = -1; + } + } + return FALSE; +} + +/*Always reject the call, if the reject call handle is valid*/ +static gboolean __call_vc_reject_call_idle_cb(gpointer puser_data) +{ + TapiResult_t tapi_err = TAPI_API_SUCCESS; + int pReqId = VC_RQSTID_DEFAULT; + + CALL_ENG_DEBUG(ENG_DEBUG, "Rejecting the [Call Handle :%d] in IDLE CB", gincoming_call_handle); + + if (gphone_rejected_call != -1) { + /*Answer the incoming call by accepting or rejecting the call */ + tapi_err = tel_answer_call(gphone_rejected_call, TAPI_CALL_ANSWER_REJECT, &pReqId); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_ERR, "tel_answer_call failed, Error: %d", tapi_err); + } + gphone_rejected_call = -1; + } + return FALSE; +} + +static gboolean __call_vc_sat_idle_cb(gpointer puser_data) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)puser_data; + + TelSatSetupCallIndCallData_t temp_data = { 0, }; + + memset(&temp_data, 0, sizeof(TelSatSetupCallIndCallData_t)); + memcpy(&temp_data, gpresult, sizeof(TelSatSetupCallIndCallData_t)); + CALL_ENG_DEBUG(ENG_DEBUG, "[SAT] call_data->calltype = 0x%x", temp_data.calltype); + CALL_ENG_DEBUG(ENG_DEBUG, "[SAT] call_data->dispText.string = %s", temp_data.dispText.string); + CALL_ENG_DEBUG(ENG_DEBUG, "[SAT] call_data->callNumber.string = %s", temp_data.callNumber.string); + CALL_ENG_DEBUG(ENG_DEBUG, "[SAT] call_data->duration = %d", (int)temp_data.duration); + + __call_vc_handle_sat_engine_events(pagent, VC_ACTION_SAT_REQUEST, gsat_event_type, gtype, gpresult); + + /*Free the result after copying the data */ + /*g_free(gpresult);*/ + gpresult = NULL; + /*Always Return FALSE from this g_idle callback, so it will not be called again */ + return FALSE; +} + +void _vc_core_engine_handle_incoming_tapi_events(void *mt_data, void *userdata) +{ + char *data = mt_data; + + call_vc_callagent_state_t *pagent = gpcall_agent_for_callback; + + VOICECALL_RETURN_IF_FAIL(pagent != NULL); + + int current_mt_call_handle = -1; + CALL_ENG_DEBUG(ENG_DEBUG, "event_type == TAPI_EVENT_CALL_INCOM_IND..."); + + /*Safety Check to avoid the mutiple incoming noti for the same call */ + current_mt_call_handle = _vc_core_cm_get_incoming_call_handle(&pagent->call_manager); + CALL_ENG_DEBUG(ENG_ERR, "current_mt_call_handle = %d", current_mt_call_handle); + + if (current_mt_call_handle != VC_TAPI_INVALID_CALLHANDLE) { + TelCallIncomingCallInfo_t mt_call_info; + CALL_ENG_DEBUG(ENG_ERR, "Already an Incoming Call exits ,Problem in accpeting the incoming call, Current Call Details"); + CALL_VC_DUMP_CALLDETAILS(&pagent->call_manager); + CALL_ENG_DEBUG(ENG_ERR, "****************Currently received call details *************************"); + + memset(&mt_call_info, 0, sizeof(TelCallIncomingCallInfo_t)); + memcpy(&mt_call_info, data, sizeof(TelCallIncomingCallInfo_t)); + CALL_ENG_DEBUG(ENG_ERR, "****************call handle = [%d] *************************", mt_call_info.CallHandle); + CALL_ENG_DEBUG(ENG_ERR, "****************call Number = [%s] *************************", mt_call_info.szCallingPartyNumber); + CALL_ENG_DEBUG(ENG_ERR, "**************** Ignoring this incoming notification *************************"); + return; + } + + memset(&gincoming_call_info, 0, sizeof(TelCallIncomingCallInfo_t)); + memcpy(&gincoming_call_info, data, sizeof(TelCallIncomingCallInfo_t)); + gincoming_call_handle = gincoming_call_info.CallHandle; + + CALL_ENG_DEBUG(ENG_DEBUG, "CallHandle = %d, Number = %s", gincoming_call_info.CallHandle, gincoming_call_info.szCallingPartyNumber); + + /* Reject the Incoming call */ + if (FALSE == gphone_init_finished) { + CALL_ENG_DEBUG(ENG_ERR, "Phone is not initialized, So reject the Call"); + + gphone_rejected_call = gincoming_call_handle; + + /*Reject the Call in the Idle Callback */ + g_idle_add_full(G_PRIORITY_HIGH_IDLE, __call_vc_reject_call_idle_cb, pagent, NULL); + + return; + } + + /* Check the IO State before accepting the call */ + switch (pagent->io_state) { + case VC_INOUT_STATE_OUTGOING_WAIT_HOLD: + case VC_INOUT_STATE_OUTGOING_WAIT_ALERT: + case VC_INOUT_STATE_OUTGOING_WAIT_ORIG: + case VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED: + case VC_INOUT_STATE_INCOME_END: /*If the Previous End event is still not prcocessed then reject the call */ + { + call_vc_call_objectinfo_t objectInfo; + + /* setting the new member info */ + _vc_core_cm_clear_call_object(&objectInfo); + objectInfo.call_handle = gincoming_call_handle; + _vc_core_cm_change_call_state(&objectInfo, VC_CALL_STATE_REJECTED); + + /* add new member info */ + _vc_core_cm_add_call_object(&pagent->call_manager, &objectInfo); + + /*Reject the Call in the Idle Callback */ + g_idle_add_full(G_PRIORITY_HIGH_IDLE, __call_vc_reject_call_full_idle_cb, pagent, NULL); + + return; + } + break; + /*If Outgoing call is in any of the following wait state during an Incoming Event Cancel the Outgoing Call */ + case VC_INOUT_STATE_OUTGOING_WAIT_RELEASE: /*If Outgoing call is in any of the following wait state during an Incoming Event Cancel the Outgoing Call */ + case VC_INOUT_STATE_OUTGOING_ABORTED: + case VC_INOUT_STATE_OUTGOING_SHOW_REDIALCAUSE: + case VC_INOUT_STATE_OUTGOING_WAIT_REDIAL: + case VC_INOUT_STATE_OUTGOING_SHOW_RETRY_CALLBOX: + { + int mo_call_handle = -1; + mo_call_handle = _vc_core_cm_get_outgoing_call_handle(&pagent->call_manager); + _vc_core_cm_remove_call_object(&pagent->call_manager, mo_call_handle); + + /* Inform the Client that waiting outgoing call are cleaned up to accept the incoming call , */ + _vc_core_ca_send_event_to_client(pagent, VC_ACTION_INCOM_FORCE, mo_call_handle, 0, NULL); + } + default: + break; + } + + /*If Incoming End event is still pending, First Process the incoming end indication before processing the new + Incoming Call */ + if (VC_INOUT_STATE_INCOME_END == pagent->io_state) { + int mt_call_handle = -1; + + CALL_ENG_DEBUG(ENG_ERR, "Previous Incoming End Call Not processed, Processing Here"); + mt_call_handle = _vc_core_cm_get_incoming_call_handle(&pagent->call_manager); + if (mt_call_handle != -1) { + __call_vc_incomingcall_endhandle(pagent, mt_call_handle); + } + } + + /* Handle Incoming Call */ + if (TRUE == _vc_core_tapi_event_handle_incoming_event(pagent, gincoming_call_handle, &gincoming_call_info)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Using Idle Add Full with G_PRIORITY_HIGH_IDLE for processing Incoming Call"); + g_idle_add_full(G_PRIORITY_HIGH_IDLE, __call_vc_incoming_idle_cb, pagent, NULL); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "MT CALL event processed done."); + return; + +} + +static void __call_vc_handle_tapi_events(TelTapiEvent_t *event, void *userdata) +{ + int event_type = event->EventType; + int status = event->Status; + char *data = event->pData; + + call_vc_callagent_state_t *pagent = gpcall_agent_for_callback; + + VOICECALL_RETURN_IF_FAIL(pagent != NULL); + + CALL_ENG_DEBUG(ENG_WARN, "event_type:[0x%x], status= %d", event_type, status); + + /* Process TAPI events */ + switch (event_type) { +#ifdef _INCOM_END_ + case TAPI_EVENT_CALL_INCOM_IND: + { + int current_mt_call_handle = -1; + CALL_ENG_DEBUG(ENG_DEBUG, "event_type == TAPI_EVENT_CALL_INCOM_IND..."); + + /*Safety Check to avoid the mutiple incoming noti for the same call */ + current_mt_call_handle = _vc_core_cm_get_incoming_call_handle(&pagent->call_manager); + CALL_ENG_DEBUG(ENG_ERR, "current_mt_call_handle = %d", current_mt_call_handle); + + if (current_mt_call_handle != VC_TAPI_INVALID_CALLHANDLE) { + TelCallIncomingCallInfo_t mt_call_info; + CALL_ENG_DEBUG(ENG_ERR, "Already an Incoming Call exits ,Problem in accpeting the incoming call, Current Call Details"); + CALL_VC_DUMP_CALLDETAILS(&pagent->call_manager); + CALL_ENG_DEBUG(ENG_ERR, "****************Currently received call details *************************"); + + memset(&mt_call_info, 0, sizeof(TelCallIncomingCallInfo_t)); + memcpy(&mt_call_info, data, sizeof(TelCallIncomingCallInfo_t)); + CALL_ENG_DEBUG(ENG_ERR, "****************call handle = [%d] *************************", mt_call_info.CallHandle); + CALL_ENG_DEBUG(ENG_ERR, "****************call Number = [%s] *************************", mt_call_info.szCallingPartyNumber); + CALL_ENG_DEBUG(ENG_ERR, "**************** Ignoring this incoming notification *************************"); + return; + } + + memset(&gincoming_call_info, 0, sizeof(TelCallIncomingCallInfo_t)); + memcpy(&gincoming_call_info, data, sizeof(TelCallIncomingCallInfo_t)); + gincoming_call_handle = gincoming_call_info.CallHandle; + + CALL_ENG_DEBUG(ENG_DEBUG, "CallHandle = %d, Number = %s", gincoming_call_info.CallHandle, gincoming_call_info.szCallingPartyNumber); + + /* Reject the Incoming call */ + if (FALSE == gphone_init_finished) { + CALL_ENG_DEBUG(ENG_ERR, "Phone is not initialized, So reject the Call"); + + gphone_rejected_call = gincoming_call_handle; + + /*Reject the Call in the Idle Callback */ + g_idle_add_full(G_PRIORITY_HIGH_IDLE, __call_vc_reject_call_idle_cb, pagent, NULL); + + return; + } + + /* Check the IO State before accepting the call */ + switch (pagent->io_state) { + case VC_INOUT_STATE_OUTGOING_WAIT_HOLD: + case VC_INOUT_STATE_OUTGOING_WAIT_ALERT: + case VC_INOUT_STATE_OUTGOING_WAIT_ORIG: + case VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED: + case VC_INOUT_STATE_INCOME_END: /*If the Previous End event is still not prcocessed then reject the call */ + { + call_vc_call_objectinfo_t objectInfo; + + /* setting the new member info */ + _vc_core_cm_clear_call_object(&objectInfo); + objectInfo.call_handle = gincoming_call_handle; + _vc_core_cm_change_call_state(&objectInfo, VC_CALL_STATE_REJECTED); + + /* add new member info */ + _vc_core_cm_add_call_object(&pagent->call_manager, &objectInfo); + + /*Reject the Call in the Idle Callback */ + g_idle_add_full(G_PRIORITY_HIGH_IDLE, __call_vc_reject_call_full_idle_cb, pagent, NULL); + + return; + } + break; + /*If Outgoing call is in any of the following wait state during an Incoming Event Cancel the Outgoing Call */ + case VC_INOUT_STATE_OUTGOING_WAIT_RELEASE: /*If Outgoing call is in any of the following wait state during an Incoming Event Cancel the Outgoing Call */ + case VC_INOUT_STATE_OUTGOING_ABORTED: + case VC_INOUT_STATE_OUTGOING_SHOW_REDIALCAUSE: + case VC_INOUT_STATE_OUTGOING_WAIT_REDIAL: + case VC_INOUT_STATE_OUTGOING_SHOW_RETRY_CALLBOX: + { + int mo_call_handle = -1; + mo_call_handle = _vc_core_cm_get_outgoing_call_handle(&pagent->call_manager); + _vc_core_cm_remove_call_object(&pagent->call_manager, mo_call_handle); + + /* Inform the Client that waiting outgoing call are cleaned up to accept the incoming call , */ + _vc_core_ca_send_event_to_client(pagent, VC_ACTION_INCOM_FORCE, mo_call_handle, 0, NULL); + } + default: + break; + } + + /*If Incoming End event is still pending, First Process the incoming end indication before processing the new + Incoming Call */ + if (VC_INOUT_STATE_INCOME_END == pagent->io_state) { + int mt_call_handle = -1; + + CALL_ENG_DEBUG(ENG_ERR, "Previous Incoming End Call Not processed, Processing Here"); + mt_call_handle = _vc_core_cm_get_incoming_call_handle(&pagent->call_manager); + if (mt_call_handle != -1) { + __call_vc_incomingcall_endhandle(pagent, mt_call_handle); + } + } + + /* Handle Incoming Call */ + if (TRUE == _vc_core_tapi_event_handle_incoming_event(pagent, gincoming_call_handle, &gincoming_call_info)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Using Idle Add Full with G_PRIORITY_HIGH_IDLE for processing Incoming Call"); + g_idle_add_full(G_PRIORITY_HIGH_IDLE, __call_vc_incoming_idle_cb, pagent, NULL); + } + + return; + } + break; +#endif + case TAPI_EVENT_CALL_RELEASE_CNF: + { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_RELEASE_CNF.."); + + if (TAPI_CAUSE_SUCCESS == status) { + /*Ignore this event as endication will be received from TAPI for the call release request */ + CALL_ENG_DEBUG(ENG_DEBUG, "Success response for Call Release request"); + break; + } else { + /*Call Release request failed, handle the call end process in this event itself as the end indication may not be released */ + CALL_ENG_DEBUG(ENG_ERR, "Call Release request failed, proceeding with Call end process"); + } + } + case TAPI_EVENT_CALL_END_IND: /*Fall Through */ + { + call_vc_call_objectinfo_t objectInfo; + voicecall_call_state_t present_call_state = VC_CALL_STATE_NONE; + call_vc_handle incoming_call_handle = VC_TAPI_INVALID_CALLHANDLE; + TelTapiEndCause_t tapi_cause = TAPI_CALL_END_NO_CAUSE; + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + TelCallEndInfo_t callEndInfo; + + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_END_IND.."); + + if (TAPI_EVENT_CALL_RELEASE_CNF == event_type) { + /* tapicallback data = Call Handle */ + memset(&call_handle, 0, sizeof(call_vc_handle)); + memcpy(&call_handle, data, sizeof(call_vc_handle)); + + /*Tapi doesn't send cause for TAPI_EVENT_CALL_RELEASE_CNF */ + tapi_cause = TAPI_CALL_END_NO_CAUSE; + } else { + /* tapicallback data = CallEndInfo */ + memset(&callEndInfo, 0, sizeof(TelCallEndInfo_t)); + memcpy(&callEndInfo, data, sizeof(TelCallEndInfo_t)); + + call_handle = callEndInfo.pCallHandle; + tapi_cause = callEndInfo.CallEndCause; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d,end cause:%d", call_handle, tapi_cause); + + /*the end of incoming call rejected by callagent, because the call had come before the phone is initialized */ + if (call_handle == gphone_rejected_call) { + CALL_ENG_DEBUG(ENG_DEBUG, "Rejected call..phone not initialized"); + + gphone_rejected_call = VC_TAPI_INVALID_CALLHANDLE; + + /*If no more calls available, End the Application */ + __vc_core_check_engine_active_task(pagent); + return; + } + + incoming_call_handle = _vc_core_cm_get_incoming_call_handle(&pagent->call_manager); + present_call_state = _vc_core_cm_get_call_state(&pagent->call_manager, call_handle); + + CALL_ENG_DEBUG(ENG_DEBUG, "New Call Handle = %d, Already registered MT call handle : %d", call_handle, incoming_call_handle); + switch (present_call_state) { + case VC_CALL_STATE_NONE: + case VC_CALL_STATE_ENDED: + case VC_CALL_STATE_ENDED_FINISH: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d state is %d", call_handle, present_call_state); + /*If no more calls available, End the Application */ + __vc_core_check_engine_active_task(pagent); + return; + } + break; + case VC_CALL_STATE_REJECTED: + { + /*End of incoming call (not registered as incoming call in CallAgent) rejected by callagent */ + if (incoming_call_handle != call_handle) { + _vc_core_cm_remove_call_object(&pagent->call_manager, call_handle); + CALL_ENG_DEBUG(ENG_DEBUG, "end of call rejected by callagent"); + + /*If no more calls available, End the Application */ + __vc_core_check_engine_active_task(pagent); + return; + } + } + break; + default: + break; + } + + /*End of the call rejected by user or by callagent (when hold is failed) */ + if ((VC_INOUT_STATE_INCOME_WAIT_RELEASE == pagent->io_state) && (incoming_call_handle == call_handle)) { + _vc_core_cm_remove_call_object(&pagent->call_manager, call_handle); + + /*Change the In Out state to None*/ + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_NONE); + + /*Notify Client about rejected Event*/ + _vc_core_ca_send_event_to_client(pagent, VC_CALL_REJECTED_END, call_handle, 0, NULL); + + return; + } + + /*End of Incoming Call */ + if (incoming_call_handle == call_handle) { + CALL_ENG_DEBUG(ENG_DEBUG, "Adding Incoming End Event to Idle Callback"); + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_INCOME_END); + /*Make sure that the End Indication is processed always after the Incoming Indication , as both are + processed in Idle Add Callbacks */ + g_idle_add(__call_vc_incoming_call_end_idle_cb, pagent); + return; + } + + /*End of Outgoing Call */ + if (_vc_core_cm_get_outgoing_call_handle(&pagent->call_manager) == call_handle) { + __call_vc_outgoingcall_endhandle(pagent, call_handle, TAPI_EVENT_CALL_END_IND, tapi_cause); + return; + } + + /*End of Normal Connected Call */ + _vc_core_tapi_event_handle_call_end_event(pagent, event_type, call_handle, tapi_cause); + + CALL_VC_DUMP_CALLDETAILS(&pagent->call_manager); + _vc_core_cm_clear_call_object(&objectInfo); + if (FALSE == _vc_core_cm_get_call_object(&pagent->call_manager, call_handle, &objectInfo)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Call Already Cleared for Call Handle = %d", call_handle); + + /* + * Because of _vc_core_tapi_rqst_answer_call( .., VC_ANSWER_HOLD_ACTIVE_AND_ACCEPT,.. ) inside _vc_core_tapi_event_handle_call_end_event(), + * pagent->call_manager is cleared. so, we didn't send VC_CALL_NORMAL_END to call-ui. + * so we should send this event to call-ui. + */ + { + voice_call_end_cause_type_t end_cause_type; + _vc_core_tapi_event_get_end_cause_type(event_type, tapi_cause, &end_cause_type); + _vc_core_ca_send_event_to_client(pagent, VC_CALL_NORMAL_END, call_handle, end_cause_type, NULL); + } + } else { + _vc_core_ca_send_event_to_client(pagent, VC_CALL_NORMAL_END, objectInfo.call_handle, objectInfo.end_cause_type, NULL); + } + } + break; + case TAPI_EVENT_CALL_RELEASE_ALL_CNF: + { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_RELEASE_ALL_CNF"); + } + break; + case TAPI_EVENT_CALL_RELEASE_ALL_ACTIVE_CNF: + { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_RELEASE_ALL_ACTIVE_CNF"); + } + break; + case TAPI_EVENT_CALL_RELEASE_ALL_HELD_CNF: + { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_RELEASE_ALL_HELD_CNF"); + } + break; + case TAPI_EVENT_CALL_ALERT_IND: + { + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + call_vc_handle mo_call_handle = VC_TAPI_INVALID_CALLHANDLE; + + CALL_ENG_KPI("TAPI_EVENT_CALL_ALERT_IND START"); + /*There are possiblities, that TAPI issued the Alert Notification and it is pending in the gmain loop, but meanwhile, the call + is released by the user - so ignore the event if it doesn't match with the IN OUT Wait state */ + if (VC_INOUT_STATE_OUTGOING_WAIT_ALERT != pagent->io_state) { + CALL_ENG_DEBUG(ENG_DEBUG, "Io State not in WAIT_ORIG, current io state is : %d", pagent->io_state); + return; + } + /*tapi_data = (call_handle)*/ + memcpy(&call_handle, data, sizeof(call_vc_handle)); + CALL_ENG_DEBUG(ENG_DEBUG, "Alert Call Handle = %d", call_handle); + + mo_call_handle = _vc_core_cm_get_outgoing_call_handle(&pagent->call_manager); + CALL_ENG_DEBUG(ENG_DEBUG, "MO Call Handle = %d", mo_call_handle); + + /*Get the outgoing call handle from CallManger and check*/ + if ((VC_TAPI_INVALID_CALLHANDLE == call_handle) || (mo_call_handle != call_handle)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call does not exist or call_handle doesn't match"); + break; + } + + _vc_core_tapi_event_handle_alert_event(pagent, call_handle); + CALL_ENG_KPI("TAPI_EVENT_CALL_ALERT_IND done"); + } + break; + case TAPI_EVENT_CALL_SETUP_CNF: + { + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + call_vc_call_objectinfo_t objectInfo; + + CALL_ENG_DEBUG(ENG_DEBUG, "Data Received for Setup CNF is %p", data); + CALL_ENG_KPI("Set Up CNF start"); + + if (TRUE == _vc_core_cm_get_outgoing_call_info(&pagent->call_manager, &objectInfo)) { + CALL_ENG_DEBUG(ENG_DEBUG, "MO call index (%d)",objectInfo.call_id); + } else { + CALL_ENG_DEBUG(ENG_ERR, "EXCEPTION:Outgoing call Info Missing.."); + } + + /*Copy Telephony Data */ + /* tapi_data = (call_handle) */ + if (data != NULL) { + memcpy(&call_handle, data, sizeof(call_vc_handle)); + CALL_ENG_DEBUG(ENG_DEBUG, "Received Call Handle = %d", call_handle); + } + + if (VC_INOUT_STATE_OUTGOING_WAIT_ORIG != pagent->io_state) { + CALL_ENG_DEBUG(ENG_DEBUG, "Io State not in WAIT_ORIG, current io state is : %d", pagent->io_state); + return; + } + + if (TAPI_CAUSE_SUCCESS == status) { + /* Get the outgoing call handle from CallManger and check */ + if ((VC_TAPI_INVALID_CALLHANDLE == call_handle)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call does not exist or call_handle doesn't match"); + break; + } + + /* Set the Call Handle to the CallbObject for future reference */ + objectInfo.call_handle = call_handle; + _vc_core_cm_set_outgoing_call_info(&pagent->call_manager, &objectInfo); + + _vc_core_tapi_event_handle_originated_event(pagent, call_handle); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "MO Call SetupCNF Failed with error cause: %d", status); + + _vc_core_cm_clear_call_object(&objectInfo); + + __call_vc_outgoingcall_endhandle(pagent, objectInfo.call_handle, TAPI_EVENT_CALL_END_IND, TAPI_CC_CAUSE_FACILITY_REJECTED); + } + CALL_ENG_KPI("Set Up CNF done"); + } + break; + case TAPI_EVENT_CALL_ANSWER_CNF: + { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_ANSWER_CNF"); + + if (status != TAPI_CAUSE_SUCCESS) { + /*If IO State is waiting for Answer Response */ + if ((VC_INOUT_STATE_INCOME_WAIT_CONNECTED == pagent->io_state) || (VC_INOUT_STATE_INCOME_WAIT_HOLD_CONNECTED == pagent->io_state) || (VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVE_CONNECTED == pagent->io_state)) { + int mt_call_handle = -1; + + mt_call_handle = _vc_core_cm_get_incoming_call_handle(&pagent->call_manager); + + if (mt_call_handle != -1) { + CALL_ENG_DEBUG(ENG_DEBUG, "mt_call_handle = %d", mt_call_handle); + + /*Send Hold Failed Notification to client UI */ + if (pagent->callagent_state == CALL_VC_CA_STATE_WAIT_HOLD) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_NORMAL); + _vc_core_ca_send_event_to_client(pagent, VC_ERROR_OCCURED, ERROR_VOICECALL_HOLD_FAILED, 0, NULL); + } + + /*Send Incoming call MT End Indication to Client UI */ + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_INCOME_END); + g_idle_add(__call_vc_incoming_call_end_idle_cb, pagent); + } + } + }else { + _vc_core_ca_send_event_to_client(pagent, VC_CALL_ANSWER_CNF, 0, 0, NULL); + } + } + break; + case TAPI_EVENT_CALL_CONNECTED_IND: + { + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + + CALL_ENG_DEBUG(ENG_DEBUG, "event_type == TAPI_EVENT_CALL_CONNECTED_IND..."); + CALL_ENG_KPI("TAPI_EVENT_CALL_CONNECTED_IND start"); + + /*tapi callback data = (call_handle)*/ + memcpy(&call_handle, data, sizeof(int)); + CALL_ENG_DEBUG(ENG_DEBUG, "IO State: %d", pagent->io_state); + CALL_ENG_DEBUG(ENG_DEBUG, "Connected Call Handle = %d", call_handle); + + if (call_handle == _vc_core_cm_get_incoming_call_handle(&pagent->call_manager)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming call is being connected..."); + } else if (call_handle == _vc_core_cm_get_outgoing_call_handle(&pagent->call_manager)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call is being connected..."); + } else { + CALL_ENG_DEBUG(ENG_ERR, "invalid connected event Call Handle = %d", call_handle); + + if ((VC_INVALID_CALL_INDEX != pagent->call_manager.mtcall_index) || (VC_INVALID_CALL_INDEX != pagent->call_manager.setupcall_info.mocall_index)) { + CALL_ENG_DEBUG(ENG_DEBUG, "incoming/outgoin calls call exits, invalid call handle [PROBLEM]"); + CALL_VC_DUMP_CALLDETAILS(&pagent->call_manager); + + assert(0); + } else { + CALL_ENG_DEBUG(ENG_ERR, "No pending calls to connect, ignoreing connect event for call handle= %d", call_handle); + return; + } + break; + } + + /*Handle Connected Call Event */ + _vc_core_tapi_event_handle_call_connect_event(pagent, call_handle); + CALL_ENG_KPI("TAPI_EVENT_CALL_CONNECTED_IND done"); + } + break; + case TAPI_EVENT_CALL_HOLD_CNF: + { + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + + CALL_ENG_DEBUG(ENG_DEBUG, "event_type == TAPI_EVENT_CALL_HOLD_CNF..."); + if (TAPI_CAUSE_SUCCESS == status) { + /*tapicallback data = call_handle*/ + memcpy(&call_handle, data, sizeof(call_vc_handle)); + } else { + _vc_core_cm_get_first_active_call_handle(&pagent->call_manager, &call_handle); + } + + if (_vc_core_tapi_event_handle_call_held_event(pagent, call_handle, status) == FALSE) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_NORMAL); + } else { + /* + Be carefull in clearing the end call member, because _vc_core_engine_status_is_any_call_ending + function depends on the end call object status. If it is cleared often, the check by + _vc_core_engine_status_is_any_call_ending becomes invalid + */ + _vc_core_cm_clear_endcall_member(&pagent->call_manager); + } + } + break; + case TAPI_EVENT_CALL_RETRIEVE_CNF: + { + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + + CALL_ENG_DEBUG(ENG_DEBUG, "event_type == TAPI_EVENT_CALL_RETRIEVE_CNF..."); + + if (TAPI_CAUSE_SUCCESS == status) { + /*tapicallback data = call_handle*/ + memcpy(&call_handle, data, sizeof(call_vc_handle)); + } else { + _vc_core_cm_get_first_held_call_handle(&pagent->call_manager, &call_handle); + } + + if (_vc_core_tapi_event_handle_call_retrieve_event(pagent, call_handle, status) == FALSE) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_NORMAL); + } else { + /* + Be carefull in clearing the end call member, because _vc_core_engine_status_is_any_call_ending + function depends on the end call object status. If it is cleared often, the check by + _vc_core_engine_status_is_any_call_ending becomes invalid + */ + _vc_core_cm_clear_endcall_member(&pagent->call_manager); + } + + } + break; + case TAPI_EVENT_CALL_SETUPCONFERENCE_CNF: + { + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + + CALL_ENG_DEBUG(ENG_DEBUG, "event_type == TAPI_EVENT_CALL_SETUPCONFERENCE_CNF..."); + + if (TAPI_CAUSE_SUCCESS == status) { + /*tapicallback data = call_handle*/ + memcpy(&call_handle, data, sizeof(call_vc_handle)); + } else { + call_handle = 0; + } + + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_NORMAL); + _vc_core_tapi_event_handle_call_join_event(pagent, call_handle, status); + } + break; + case TAPI_EVENT_CALL_SPLITCONFERENCE_CNF: + { + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + + CALL_ENG_DEBUG(ENG_DEBUG, "event_type == TAPI_EVENT_CALL_SPLITCONFERENCE_CNF..."); + + if (TAPI_CAUSE_SUCCESS == status) { + /*tapicallback data = call_handle*/ + memcpy(&call_handle, data, sizeof(call_vc_handle)); + } + + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_NORMAL); + _vc_core_tapi_event_handle_call_split_event(pagent, call_handle, status); + } + break; + case TAPI_EVENT_CALL_TRANSFER_CNF: + { + CALL_ENG_DEBUG(ENG_DEBUG, "event_type == TAPI_EVENT_CALL_TRANSFER_CNF"); + + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_NORMAL); + _vc_core_tapi_event_handle_call_transfer_event(pagent, status); + } + break; + case TAPI_EVENT_CALL_RETRIEVE_IND: + case TAPI_EVENT_CALL_HOLD_IND: + case TAPI_EVENT_CALL_TRANSFER_IND: + case TAPI_EVENT_CALL_SETUPCONFERENCE_IND: + case TAPI_EVENT_CALL_BARRING_IND: + case TAPI_EVENT_CALL_WAITING_IND: + case TAPI_EVENT_CALL_COND_FORWARDING_IND: + case TAPI_EVENT_CALL_UNCOND_FORWARDING_IND: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Received Indication %d", event_type); + if (TRUE == __call_vc_is_callagent_waitstate(pagent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "[Now tapi requesting...callagent_state=%d, not display network ind]", pagent->callagent_state); + return; + + } else { + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + + /*tapicallback data = call_handle + cause*/ + memcpy(&call_handle, data, sizeof(call_vc_handle)); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d", call_handle); + + _vc_core_tapi_event_handle_notification(pagent, event_type, 0); + } + } + break; + case TAPI_EVENT_CALL_CUGINFO_IND: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Received TAPI_EVENT_CALL_CUGINFO_IND"); + + if (TRUE == __call_vc_is_callagent_waitstate(pagent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "[Now tapi requesting...callagent_state=%d, not display network ind]", pagent->callagent_state); + return; + + } else { + int cugIndex = 0; + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + + /*tapicallback data = call_handle + cause*/ + memcpy(&call_handle, data, sizeof(call_vc_handle)); + memcpy(&cugIndex, data + sizeof(call_vc_handle), sizeof(int)); + + /*cugindex is not used inside this function*/ + /*It may be used in the future*/ + _vc_core_tapi_event_handle_notification(pagent, event_type, cugIndex); + } + } + break; + case TAPI_EVENT_CALL_CALLINGNAMEINFO_IND: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Received TAPI_EVENT_CALL_CALLINGNAMEINFO_IND"); + CALL_ENG_DEBUG(ENG_DEBUG, "Event Not Handled, Feature Not Implemented"); + +#ifdef _CALLING_NAME_INFO_ + if (TRUE == __call_vc_is_callagent_waitstate(pagent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "[Now tapi requesting...callagent_state=%d, not display network ind]", pagent->callagent_state); + return; + + } else { + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + /*Structure for calling name information */ + TelCallingNameInfo_t calling_nameinfo; + memset(&calling_nameinfo, 0, sizeof(TelCallingNameInfo_t)); + + /*TapiCallingNameInfo is padded as second parameneter + tapicallback data = call_handle + cause*/ + memcpy(&call_handle, data, sizeof(call_vc_handle)); + memcpy(&calling_nameinfo, data + sizeof(call_vc_handle), sizeof(TelCallingNameInfo_t)); + + /*calling_info is not used in this function, so not passed. + It may be used in the future*/ + _vc_core_tapi_event_handle_notification(pagent, event_type, 0); + } +#endif + } + break; +#ifdef _OLD_TAPI_ + case TAPI_EVENT_CALL_SSNOTIFY_IND: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Received TAPI_EVENT_CALL_SSNOTIFY_IND"); + CALL_ENG_DEBUG(ENG_DEBUG, "Event Not Handled, Feature Not Implemented"); + + if (TRUE == __call_vc_is_callagent_waitstate(pagent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "[Now tapi requesting...callagent_state=%d, not display network ind]", pagent->callagent_state); + return TRUE; + + } else { + tapi_call_ss_codes_t ss_code; + + /*ss_code is padded as first parameter in the data + data = ss_code*/ + memcpy(&ss_code, data, sizeof(tapi_call_ss_codes_t)); + _vc_core_tapi_event_handle_notification(pagent, event_type, ss_code); + + } + } + break; + + case TAPI_EVENT_CALL_REDIRECT_CNF: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Received TAPI_EVENT_CALL_REDIRECT_CNF"); + CALL_ENG_DEBUG(ENG_DEBUG, "Event Not Handled, Feature Not Implemented"); + + /*TODO abthul, not used currently */ + return; + + if (TRUE == __call_vc_is_callagent_waitstate(pagent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "[Now tapi requesting...callagent_state=%d, not display network ind]", pagent->callagent_state); + return; + } else { + gboolean bValue; + + /*bValue is padded as first parameter in data from TAPI + data = bValue*/ + memcpy(&bValue, data, sizeof(gboolean)); + _vc_core_tapi_event_handle_notification(pagent, event_type, bValue); + } + } +#endif + break; + case TAPI_EVENT_CALL_FORWARD_IND: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Received TAPI_EVENT_CALL_FORWARD_IND"); + + if (TRUE == __call_vc_is_callagent_waitstate(pagent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "[Now tapi requesting...callagent_state=%d, not display network ind]", pagent->callagent_state); + return; + + } else { + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + TelCallForwardType_t forwardind_type = -1; + + /*tapicallback data = call_handle + forwardind_type*/ + memcpy(&call_handle, data, sizeof(call_vc_handle)); + memcpy(&forwardind_type, data + sizeof(call_vc_handle), sizeof(TelCallForwardType_t)); + + _vc_core_tapi_event_handle_notification(pagent, event_type, forwardind_type); + } + } + break; + case TAPI_EVENT_CALL_AOCINFO_IND: + { + TelCallAocInfo_t aoc_info; + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + memset(&aoc_info, 0, sizeof(TelCallAocInfo_t)); + + CALL_ENG_DEBUG(ENG_DEBUG, "Recived TAPI_EVENT_CALL_AOCINFO_IND..."); + + /*data = call_handle + tapi_call_aoc_info_t */ + memcpy(&call_handle, data, sizeof(int)); + memcpy(&aoc_info, (data + sizeof(int)), sizeof(TelCallAocInfo_t)); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d", call_handle); + _vc_core_tapi_event_handle_aoc(pagent, call_handle, &aoc_info); + } + break; + case TAPI_EVENT_SS_AOC_RSP: + { + TelCallAocInfo_t aoc_info; + + CALL_ENG_DEBUG(ENG_DEBUG, "Recived TAPI_EVENT_SS_AOC_RSP"); + + if (TAPI_CAUSE_SUCCESS == status) { + memset(&aoc_info, 0, sizeof(TelCallAocInfo_t)); + memcpy(&aoc_info, data, sizeof(TelCallAocInfo_t)); + + switch (aoc_info.AocType) { + case TAPI_SS_AOC_TYPE_PUC: + CALL_ENG_DEBUG(ENG_DEBUG, "Recived aoc_ppm = %f", aoc_info.PPM); + pagent->aoc_ppm = aoc_info.PPM; + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Action not defined for AOC Type : %d", aoc_info.AocType); + } + } + } + break; + case TAPI_EVENT_CALL_CONNECTEDNUMBERINFO_IND: + { + TelCallConnectedNumberInfo_t connected_number_info; + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + memset(&connected_number_info, 0, sizeof(TelCallConnectedNumberInfo_t)); + + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_CONNECTEDNUMBERINFO_IND"); + + /*data = callhandle + 0(dwParam)*/ + memcpy(&call_handle, data, sizeof(call_vc_handle)); + memcpy(&connected_number_info, (data + sizeof(call_vc_handle)), sizeof(TelCallConnectedNumberInfo_t)); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d", call_handle); + + /*Abthul:todo , Check the usage of connected number info*/ + _vc_core_tapi_event_connected_line_ind_handle(pagent, call_handle, &connected_number_info); + } + break; + case TAPI_EVENT_CALL_SEND_DTMF_CNF: + { + CALL_ENG_DEBUG(ENG_DEBUG, "event_type == TAPI_EVENT_CALL_SEND_DTMF_CNF"); + + if (TAPI_CAUSE_SUCCESS != status) { + CALL_ENG_DEBUG(ENG_DEBUG, "Tapi Error Code %d", status); + /*Forward the events to client */ + _vc_core_ca_send_event_to_client(pagent, VC_CALL_DTMF_ACK, FALSE, 0, NULL); + } else { + /*Forward the events to client */ + _vc_core_ca_send_event_to_client(pagent, VC_CALL_DTMF_ACK, TRUE, 0, NULL); + } + } + break; + case TAPI_EVENT_SOUND_VOLUMECTRL_RSP: + { + int tapi_sound_path = 0; + int volume_level = 0; + tapi_sound_volumn_ctrl_res snd_resp_data; + + memset(&snd_resp_data, 0, sizeof(tapi_sound_volumn_ctrl_res)); + memcpy(&snd_resp_data, data, sizeof(tapi_sound_volumn_ctrl_res)); + + int i = 0; + tapi_sound_path = pagent->curr_tapi_path; + for (i = 0; i < snd_resp_data.num_record; i++) { + if (tapi_sound_path == snd_resp_data.pinfo[i].type) { + volume_level = snd_resp_data.pinfo[i].level; + break; + } + } + CALL_ENG_DEBUG(ENG_DEBUG, "Changed Vol Type = %d, Vol Level = %d", tapi_sound_path, volume_level); + + _vc_core_ca_send_event_to_client(pagent, VC_CALL_GET_VOLUME_RESP, tapi_sound_path, volume_level, NULL); + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Default: event_type = %d", event_type); + break; + } + CALL_ENG_DEBUG(ENG_DEBUG, "tapi event(%d) processed done.", event_type); + + return; +} + +static gboolean __call_vc_outgoingcall_endhandle(call_vc_callagent_state_t *pagent, call_vc_handle call_handle, int type, TelTapiEndCause_t tapi_cause) +{ + call_vc_call_objectinfo_t objectInfo; + voice_call_end_cause_type_t endcause_type = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pagent != NULL); + + _vc_core_cm_clear_call_object(&objectInfo); + _vc_core_cm_get_call_object(&pagent->call_manager, call_handle, &objectInfo); + + /*Inform Client App about MO Call Disconnect */ + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_OUTGOING_ABORTED); + _vc_core_tapi_event_get_end_cause_type(type, tapi_cause, &endcause_type); + _vc_core_ca_send_event_to_client(pagent, VC_CALL_OUTGOING_END, call_handle, (int)endcause_type, NULL); + + /* Response call setup result to SAT if this is SAT call */ + if (VC_CALL_ORIG_TYPE_SAT == objectInfo.call_type) { + /*Cancelled by user */ + if (VC_CALL_STATE_CANCELLED == objectInfo.state) { + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SETUP_CALL, CALL_VC_ME_CLEAR_DOWN_BEFORE_CONN); + } else { /* Disconnected by Network */ + + call_vc_satsetup_info_t *pcall_vc_satcall_info = NULL; + + pcall_vc_satcall_info = (call_vc_satsetup_info_t *) &(pagent->call_manager.setupcall_info.satcall_setup_info); + + if (FALSE == pcall_vc_satcall_info->redial) { + /*Send only if SAT redial is not enabled */ + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SETUP_CALL, CALL_VC_NETWORK_UNABLE_TO_PROCESS_COMMAND); + } + } + + /*Free SAT Icon data if available */ + if (pagent->call_manager.setupcall_info.satcall_setup_info.psat_rgb_data != NULL) { + free(pagent->call_manager.setupcall_info.satcall_setup_info.psat_rgb_data); + pagent->call_manager.setupcall_info.satcall_setup_info.psat_rgb_data = NULL; + } + } + + /* SS: 1 send, while outgoing is CONNECTING state... */ + if (CALL_VC_CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL == pagent->callagent_state) { + gboolean bActiveCall = _vc_core_cm_isexists_active_call(&pagent->call_manager); + gboolean bHoldCall = _vc_core_cm_isexists_held_call(&pagent->call_manager); + + if (FALSE == bActiveCall) { + if (TRUE == bHoldCall) { + CALL_ENG_DEBUG(ENG_DEBUG, "Continue SS Action"); + + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_NONE); + + if (_vc_core_tapi_rqst_retrieve_call(pagent) == TRUE) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_UNHOLD); + } else { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_NORMAL); + } + } else { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_NORMAL); + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "active call must not exist!"); + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_NORMAL); + } + } + + return TRUE; +} + +static gboolean __call_vc_incoming_call_end_idle_cb(gpointer puser_data) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)puser_data; + call_vc_handle call_handle = -1; + + CALL_ENG_DEBUG(ENG_DEBUG, "Ending the Incoming Call in Idle Callback"); + /*Send the Incoming end indication to the client, only if the io state is in VC_INOUT_STATE_INCOME_END */ + if (VC_INOUT_STATE_INCOME_END == pagent->io_state) { + call_handle = _vc_core_cm_get_incoming_call_handle(&pagent->call_manager); + if (-1 != call_handle) { + __call_vc_incomingcall_endhandle(pagent, call_handle); + } + } + return FALSE; +} + +static gboolean __call_vc_incomingcall_endhandle(call_vc_callagent_state_t *pagent, call_vc_handle call_handle) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + CALL_VC_DUMP_CALLDETAILS(&pagent->call_manager); + + if (TRUE == _vc_core_ca_send_event_to_client(pagent, VC_CALL_INCOM_END, call_handle, 0, NULL)) { + CALL_ENG_DEBUG(ENG_DEBUG, "client call back returned TRUE Removing Inomcing call Object"); + + /*Remove Call Object Once the Incoming Call Got Ended*/ + _vc_core_cm_remove_call_object(&pagent->call_manager, call_handle); + + CALL_VC_DUMP_CALLDETAILS(&pagent->call_manager); + + /*Finally Move the IO State None*/ + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_NONE); + } + return TRUE; +} + +static gboolean __call_vc_is_callagent_waitstate(call_vc_callagent_state_t *pagent) +{ + + switch (pagent->callagent_state) { + case CALL_VC_CA_STATE_WAIT_SPLIT: + case CALL_VC_CA_STATE_WAIT_DROP: + case CALL_VC_CA_STATE_WAIT_SWAP: + case CALL_VC_CA_STATE_WAIT_HOLD: + case CALL_VC_CA_STATE_WAIT_UNHOLD: + case CALL_VC_CA_STATE_WAIT_JOIN: + case CALL_VC_CA_STATE_WAIT_TRANSFER_CNF: + case CALL_VC_CA_STATE_WAIT_TRANSFER_CALLEND: + case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_ACTIVECALL: + case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_HOLDCALL: + case CALL_VC_CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL: + case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS: + case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SETUP: + case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SWITCH_TO_VIDEO_CALL: + { + return TRUE; + } + break; + default: + return FALSE; + } +} + +/** + * This function checks whether dtmf is possible + * + * @return This function returns TRUE if dtmf is possible or else FALSE + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean __vc_core_is_dtmf_possible(call_vc_callagent_state_t *pcall_agent) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + if (VC_INOUT_STATE_NONE != pcall_agent->io_state) { + CALL_ENG_DEBUG(ENG_DEBUG, "__vc_core_is_dtmf_possible, io_state not idle"); + return FALSE; + } + + if (CALL_VC_CA_STATE_NORMAL != pcall_agent->callagent_state) { + CALL_ENG_DEBUG(ENG_DEBUG, "__vc_core_is_dtmf_possible, callagent_state not idle"); + return FALSE; + } + + if (FALSE == _vc_core_cm_isexists_active_call(&pcall_agent->call_manager)) { + CALL_ENG_DEBUG(ENG_DEBUG, "NO Active Calls available to send DTMF"); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "DTMF Possible"); + return TRUE; +} + +/** + * This function checks the voicecall engine's idle status and send VC_ACTION_NO_ACTIVE_TASK to client if engine is idle + * + * @return void + * @param[in] pcall_agent Pointer to the call agent structure + */ +void __vc_core_check_engine_active_task(call_vc_callagent_state_t *pcall_agent) +{ + VOICECALL_RETURN_IF_FAIL(pcall_agent != NULL); + if (_vc_core_ca_check_end(pcall_agent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Engine is Idle, Informing the Client"); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ACTION_NO_ACTIVE_TASK, 0, 0, NULL); + } +} + +/** +* This function ends only the connected call corresponding to the given call handle +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_handle Call handle of the call to be ended +* @remarks pvoicecall_agent cannot be NULL +* @see See also following functions +* - _vc_core_engine_make_call +* - _vc_core_engine_end_call +* - _vc_core_engine_end_call_bycallId +*/ +voicecall_error_t _vc_core_engine_end_call_byhandle(voicecall_engine_t *pvoicecall_agent, int call_handle) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(call_handle >= 0, ERROR_VOICECALL_INVALID_ARGUMENTS); + + return (TRUE == _vc_core_tapi_rqst_end_call_by_callhandle(pagent, call_handle)) ? ERROR_VOICECALL_NONE : ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; +} + +/** +* This function ends a call corresponding to the given call ID +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_id call id of the call to be ended +* @remarks pvoicecall_agent cannot be NULL +* call_id shall take only values between 1 to 7 +* @see See also following functions +* - _vc_core_engine_make_call +* - _vc_core_engine_end_call +* - _vc_core_engine_end_call_byhandle +*/ +voicecall_error_t _vc_core_engine_end_call_bycallId(voicecall_engine_t *pvoicecall_agent, int call_id) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + call_vc_groupstate_t call_group_state = CALL_VC_GROUP_STATE_NONE; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL((call_id >= 1 && call_id <= 7), ERROR_VOICECALL_INVALID_ARGUMENTS); + + call_handle = _vc_core_cm_get_call_handle_ingroup_bycallId(&pagent->call_manager, call_id); + if (VC_TAPI_INVALID_CALLHANDLE == call_handle) { + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + } + + call_group_state = _vc_core_cm_get_group_state_callid(&pagent->call_manager, call_id); + if (CALL_VC_GROUP_STATE_ACTIVE == call_group_state) { + + if (-1 == _vc_core_cm_get_active_group_index(&pagent->call_manager)) { + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + } + + if (TRUE == _vc_core_tapi_rqst_end_call_by_callhandle(pagent, call_handle)) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_DROP); + return ERROR_VOICECALL_NONE; + } + } else if (CALL_VC_GROUP_STATE_HOLD == call_group_state) { + int held_group_member_num = 0; + int held_group_index = -1; + + held_group_index = _vc_core_cm_get_held_group_index(&pagent->call_manager); + if (-1 == held_group_index) { + return FALSE; + } + + held_group_member_num = _vc_core_cm_get_member_count_ingroup(&pagent->call_manager, held_group_index); + if (held_group_member_num > 1) { + /*Individual calls cannot be ended when the conf call in held state */ + return ERROR_VOICECALL_OPERATION_NOT_ALLOWED; + } + + if (TRUE == _vc_core_tapi_rqst_end_call_by_callhandle(pagent, call_handle)) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_DROP); + return ERROR_VOICECALL_NONE; + } + } + + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; +} + +/** +* This function ends the call according to the given end call type +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] end_call_type End Call Type +* @remarks pvoicecall_agent cannot be NULL +* @see See also following functions +* - _vc_core_engine_make_call +* - _vc_core_engine_end_call_byhandle +* - _vc_core_engine_end_call_bycallId +* . +*/ +voicecall_error_t _vc_core_engine_end_call(voicecall_engine_t *pvoicecall_agent, _vc_core_engine_end_call_type_t end_call_type) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + gboolean bret_val = FALSE; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*If Call Agent is waiting for any of the release event then ignore the end call request */ + if ((CALL_VC_CA_STATE_WAIT_RELEASE_ALL_ACTIVECALL == pagent->callagent_state) || (CALL_VC_CA_STATE_WAIT_RELEASE_ALL_HOLDCALL == pagent->callagent_state) || (CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS == pagent->callagent_state)) { + return ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "end_call_type = %d", end_call_type); + + switch (end_call_type) { + case VC_END_OUTGOING_CALL: + { + bret_val = _vc_core_tapi_rqst_release_outgoing_call(pagent); + } + break; + case VC_END_INCOMING_CALL: + { + bret_val = _vc_core_tapi_rqst_release_incoming_call(pagent); + } + break; + case VC_END_ACTIVE_OR_HELD_CALLS: + { + bret_val = _vc_core_tapi_rqst_end_call(pagent); + } + break; + case VC_END_ALL_ACTIVE_CALLS: + { + bret_val = _vc_core_ca_end_active_calls(pagent); + } + break; + case VC_END_ALL_HELD_CALLS: + { + bret_val = _vc_core_ca_end_held_calls(pagent); + } + break; + case VC_END_ALL_CALLS: + { + bret_val = _vc_core_ca_end_all_calls(pagent); + } + break; + default: + return ERROR_VOICECALL_INVALID_CALL_TYPE; + } + + return (TRUE == bret_val) ? ERROR_VOICECALL_NONE : ERROR_VOICECALL_INCOMPLETE; +} + +/** +* This function does the explicit call transfer +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @remarks pvoicecall_agent cannot be NULL +*/ +voicecall_error_t _vc_core_engine_transfer_calls(voicecall_engine_t *pvoicecall_agent) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + if (CALL_VC_CA_STATE_WAIT_TRANSFER_CNF == pagent->callagent_state) { + return ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS; + } else if (FALSE == _vc_core_ca_is_transfer_call_possible(pagent)) { + return ERROR_VOICECALL_TRANSFER_CALL_NOT_POSSIBLE; + } else { + if (TRUE == _vc_core_tapi_rqst_transfer_call(pagent)) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_TRANSFER_CNF); + return ERROR_VOICECALL_NONE; + } + } + + return ERROR_VOICECALL_TRANSFER_FAILED; +} + +/** +* This function swaps the active and held calls if any available +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @remarks pvoicecall_agent cannot be NULL +* @see See also the following APIs +* - _vc_core_engine_hold_call +* - _vc_core_engine_retrieve_call +* +*/ +voicecall_error_t _vc_core_engine_swap_calls(voicecall_engine_t *pvoicecall_agent) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*If call agent is in any of the wait states, then ignore the request */ + if (TRUE == __call_vc_is_callagent_waitstate(pagent)) { + return ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS; + } + + if (TRUE == _vc_core_tapi_rqst_swap_calls(pagent)) { +#ifdef SWAP_SUPPORT + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE); +#else + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_SWAP); +#endif + return ERROR_VOICECALL_NONE; + } + + return ERROR_VOICECALL_SWAP_FAILED; +} + +/** +* This function puts the active call if any on hold +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @remarks pvoicecall_agent cannot be NULL +* @see voicecall_retreive_call +*/ +voicecall_error_t _vc_core_engine_hold_call(voicecall_engine_t *pvoicecall_agent) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + if (TRUE == __call_vc_is_callagent_waitstate(pagent)) { + return ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS; + } +#ifdef _CPHS_DEFINED_ + if (TRUE == _vc_core_svcall_cphs_csp_get_status(pagent, VC_CPHS_CSP_HOLD)) { + if (TRUE == _vc_core_tapi_rqst_hold_call(pagent)) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_HOLD); + return ERROR_VOICECALL_NONE; + } + } else { + return ERROR_VOICECALL_HOLD_NOT_SUPPORTED; + } +#else + if (TRUE == _vc_core_tapi_rqst_hold_call(pagent)) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_HOLD); + return ERROR_VOICECALL_NONE; + } +#endif + return ERROR_VOICECALL_HOLD_FAILED; +} + +/** +* This function retrieves/activates the held call +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @remarks pvoicecall_agent cannot be NULL +* @see _vc_core_engine_hold_call +*/ +voicecall_error_t _vc_core_engine_retrieve_call(voicecall_engine_t *pvoicecall_agent) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + if (TRUE == __call_vc_is_callagent_waitstate(pagent)) { + return ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS; + } + + if (TRUE == _vc_core_tapi_rqst_retrieve_call(pagent)) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_UNHOLD); + return ERROR_VOICECALL_NONE; + } + return ERROR_VOICECALL_RETREIVE_FAILED; +} + +/** +* This function sets up a conference beween the currently available active and held calls +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @remarks pvoicecall_agent cannot be NULL +* @see See also the following APIs +* - _vc_core_engine_private_call +* - _vc_core_engine_private_call_by_callid +* +*/ +voicecall_error_t _vc_core_engine_setup_conference(voicecall_engine_t *pvoicecall_agent) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*If call agent is in any of the wait states, then ignore the request */ + if (CALL_VC_CA_STATE_WAIT_JOIN == pagent->callagent_state) { + return ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS; + } else if (FALSE == _vc_core_ca_is_conf_call_possible(pagent)) { + return ERROR_VOICECALL_CONF_NOT_POSSIBLE; + } else { + if (TRUE == _vc_core_tapi_rqst_join_calls(pagent)) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_JOIN); + return ERROR_VOICECALL_NONE; + } + } + return ERROR_VOICECALL_SETUP_CONF_FAILED; +} + +/** +* This function makes a private call to the call member corressponding to the given call id. +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_id Call ID of the call to be made private +* @remarks pvoicecall_agent cannot be NULL +* @see See also the following APIs +* - _vc_core_engine_setup_conference +* - _vc_core_engine_private_call +* +*/ +voicecall_error_t _vc_core_engine_private_call_by_callid(voicecall_engine_t *pvoicecall_agent, int call_id) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL((call_id >= 1 && call_id <= 7), ERROR_VOICECALL_INVALID_ARGUMENTS); + + if (CALL_VC_CA_STATE_WAIT_SPLIT == pagent->callagent_state) { + return ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS; + } else if (FALSE == _vc_core_ca_is_private_call_possible(pagent)) { + return ERROR__vc_core_engine_private_call_NOT_POSSIBLE; + } else { + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + + call_handle = _vc_core_cm_get_call_handle_ingroup_bycallId(&pagent->call_manager, call_id); + + if (VC_TAPI_INVALID_CALLHANDLE != call_handle) { + return (TRUE == _vc_core_tapi_rqst_private_call(pagent, call_handle)) ? ERROR_VOICECALL_NONE : ERROR__vc_core_engine_private_call_FAILED; + } + } + + return ERROR_VOICECALL_INVALID_CALLID; +} + +/** +* This function makes a private call to the given call member from the currently available active conference call +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_handle call handle of the call to be made private +* @remarks pvoicecall_agent cannot be NULL +* @see See also the following APIs +* - _vc_core_engine_setup_conference +* - _vc_core_engine_private_call_by_callid +* +*/ +voicecall_error_t _vc_core_engine_private_call(voicecall_engine_t *pvoicecall_agent, int call_handle) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(call_handle >= 0, ERROR_VOICECALL_INVALID_ARGUMENTS); + + if (CALL_VC_CA_STATE_WAIT_SPLIT == pagent->callagent_state) { + return ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS; + } else if (FALSE == _vc_core_ca_is_private_call_possible(pagent)) { + return ERROR__vc_core_engine_private_call_NOT_POSSIBLE; + } + + return (TRUE == _vc_core_tapi_rqst_private_call(pagent, call_handle)) ? ERROR_VOICECALL_NONE : ERROR_VOICECALL_REQUEST_FAILED; +} + +/** +* This function rejects the incoming call if any +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] budub User Determined User Busy - TRUE, Else - FALSE +* @exception In case of exceptions return value contains appropriate error code. +* @remarks pvoicecall_agent cannot be NULL +* @see _vc_core_engine_answer_call +*/ +voicecall_error_t _vc_core_engine_reject_call(voicecall_engine_t *pvoicecall_agent, gboolean budub) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + int error_code = -1; + gboolean ret = FALSE; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + ret = _vc_core_tapi_rqst_reject_mt_call(pagent, budub, &error_code); + + return (TRUE == ret) ? ERROR_VOICECALL_NONE : error_code; +} + +/** +* This function answers a call according to the given answer type +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] answer_type The answer type to be used +* @remarks pvoicecall_agent and pcall_handle cannot be NULL +* @see _vc_core_engine_reject_call +*/ +voicecall_error_t _vc_core_engine_answer_call(voicecall_engine_t *pvoicecall_agent, voicecall_answer_type_t answer_type) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + int error_code = 0; + gboolean ret = FALSE; + + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); +#ifdef RELEASE_ALL_AND_ACCEPT_SUPPORT + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(answer_type, VC_ANSWER_NORMAL, VC_ANSWER_RELEASE_ALL_AND_ACCEPT, ERROR_VOICECALL_INVALID_ARGUMENTS); +#else + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(answer_type, VC_ANSWER_NORMAL, VC_ANSWER_RELEASE_HOLD_AND_ACCEPT, ERROR_VOICECALL_INVALID_ARGUMENTS); +#endif + ret = _vc_core_tapi_rqst_answer_call(pcall_agent, answer_type, &error_code); + + return (TRUE == ret) ? ERROR_VOICECALL_NONE : error_code; +} + +/** +* This function sends the given dtmf digits +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] pdtmf_string dtmf digits to be sent +* @remarks pvoicecall_agent and pdtmf_string cannot be NULL +* pdtmf_string shall only accept strings containing the digit value (0-9,A,B,C,D,*,#) +* +*/ +voicecall_error_t _vc_core_engine_send_dtmf(voicecall_engine_t *pvoicecall_agent, char *pdtmf_string) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pdtmf_string != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + if (FALSE == _vc_core_util_isvalid_dtmf_number(pdtmf_string)) { + _vc_core_ca_send_event_to_client(pagent, VC_ERROR_OCCURED, ERROR_VOICECALL_INVALID_DTMF_CHAR, -1, NULL); + return ERROR_VOICECALL_INVALID_DTMF_CHAR; + } + + return (TRUE == _vc_core_tapi_rqst_start_dtmf(pagent, pdtmf_string)) ? ERROR_VOICECALL_NONE : ERROR_VOICECALL_DTMF_FAILED; +} + +/** +* This function sends response to sat based on the given sat response type +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] sat_rqst_resp_type sat rqst/response type sent by client +* @param[in] sat_response_type sat response type to be sent to SAT +*/ +voicecall_error_t _vc_core_engine_send_sat_response(voicecall_engine_t *pvoicecall_agent, voicecall_engine_sat_rqst_resp_type sat_rqst_resp_type, call_vc_sat_reponse_type_t sat_response_type) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(sat_rqst_resp_type, SAT_RQST_SETUP_CALL, SAT_RESP_SETUP_CALL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(sat_response_type, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND, CALL_VC_ME_RET_SUCCESS, ERROR_VOICECALL_INVALID_ARGUMENTS); + + return (TRUE == _vc_core_ca_send_sat_response(pagent, sat_rqst_resp_type, sat_response_type)) ? ERROR_VOICECALL_NONE : ERROR_VOICECALL_REQUEST_FAILED; +} + +/** +* This function finalizes the voiecall engine and removes all allocated resources +* +* @return nothing +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @remarks pvoicecall_agent cannot be NULL +*/ +void _vc_core_engine_engine_finish(voicecall_engine_t *pvoicecall_agent) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + int error_code = 0; + int index = 0; + + VOICECALL_RETURN_IF_FAIL(pvoicecall_agent != NULL); + + /*Unsubscribe Events */ + CALL_ENG_DEBUG(ENG_DEBUG, "Unsubscribing Events"); + for (index = 0; index < CALL_VC_TAPI_SUBSCRIPTION_MAX; index++) { + error_code = tel_deregister_event(pcall_agent->subscription_id[index]); + if (error_code != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_deregister_event failed. sub id is %d error_code is %d", pcall_agent->subscription_id[index], error_code); + break; + } + } + + tel_deinit(); + + VOICECALL_RETURN_IF_FAIL(pcall_agent != NULL); + _vc_core_ca_finish_agent(pcall_agent); +} + +#ifdef _SAT_MENU_ +/** +* This function requests SAT Engine to setup SIM services Menu +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @remarks Voicecall Engine only requests the SAT engine to display the menu. +*/ +voicecall_error_t voicecall_request_sat_menu(voicecall_engine_t *pvoicecall_agent) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + TelSatSetupMenuInfo_t sim_menu; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + memset(&sim_menu, 0, sizeof(TelSatSetupMenuInfo_t)); + + if (FALSE == TelTapiSatGetMainMenuList(&sim_menu)) { + CALL_ENG_DEBUG(ENG_DEBUG, "TelTapiSatGetMainMenuList failed"); + return ERROR_VOICECALL_REQUEST_FAILED; + } + + return ERROR_VOICECALL_NONE; +} + +/** +* This function retreives the SIM Menu Title from the SAT Engine +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[out] title contains the sat menu title on sucess +*/ +voicecall_error_t voicecall_request_sat_menu_title(voicecall_engine_t *pvoicecall_agent, char *title) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + TelSatMainMenuTitleInfo_t sat_menu_title; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(title != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + memset(&sat_menu_title, 0, sizeof(TelSatMainMenuTitleInfo_t)); + + if (TRUE == TelTapiSatGetMainMenuTitle(&sat_menu_title)) { + if (TRUE == sat_menu_title.bIsMainMenuPresent) { + strcpy(title, (char *)sat_menu_title.mainMenuTitle.string); + return ERROR_VOICECALL_NONE; + } + } + + return ERROR_VOICECALL_REQUEST_FAILED; +} +#endif + +/** +* This function prepares the engine for the redial call. It preserves the previsouly made call object to used for the next make call +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] call_handle call handle +* @remarks If this API is used, _vc_core_engine_prepare_call is not reqired for making the call again. The last prepared call details will +* be used for the redialling. Application has to just use _vc_core_engine_make_call API to redial the call +*/ +voicecall_error_t _vc_core_engine_prepare_redial(voicecall_engine_t *pvoicecall_agent, int call_handle) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_call_objectinfo_t call_object; + int mo_call_handle = -1; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(call_handle >= 0, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*Check the validity of the call handle */ + mo_call_handle = _vc_core_cm_get_outgoing_call_handle(&pagent->call_manager); + if ((mo_call_handle == -1) || (mo_call_handle != call_handle)) { + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + } + + if (FALSE == _vc_core_cm_get_call_object(&pagent->call_manager, call_handle, &call_object)) { + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + } + + /*Set the callobject status */ + call_object.state = VC_CALL_STATE_REDIAL; + + /*Reintialize Call ID */ + call_object.call_id = 0; + _vc_core_cm_set_call_object(&pagent->call_manager, &call_object); + + /*Set Engine IO State */ + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_OUTGOING_SHOW_REDIALCAUSE); + + /*Abthul:todo Set SAT Redial Data */ + + return ERROR_VOICECALL_NONE; +} + +#ifdef _OLD_SAT_ +/** +* This function checks whether SAT redial duration is valid +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[out] bredial_duration Contains TRUE if SAT redial duration is enabled, FALSE otherwise +* @remarks pvoicecall_agent and bredial_duration cannot be NULL +*/ +voicecall_error_t voicecall_get_sat_redial_duration_status(voicecall_engine_t *pvoicecall_agent, gboolean * bredial_duration) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_satsetup_info_t *pcall_vc_satcall_info = NULL; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(bredial_duration != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + pcall_vc_satcall_info = (call_vc_satsetup_info_t *) &(pagent->call_manager.setupcall_info.satcall_setup_info); + + CALL_ENG_DEBUG(ENG_DEBUG, "SAT Redial Duration Status= %d", pcall_vc_satcall_info->bduration); + + *bredial_duration = pcall_vc_satcall_info->bduration; + return ERROR_VOICECALL_NONE; +} + +/** +* This function sets the current duration and retrieves the modified remaining SAT redial duration +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[out] remaining_duration remaining sat duration +* @remarks pvoicecall_agent and remaining_duration cannot be NULL +*/ +voicecall_error_t voicecall_get_set_sat_remaining_duration(voicecall_engine_t *pvoicecall_agent, long *remaining_duration) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_satsetup_info_t *pcall_vc_satcall_info = NULL; + + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(remaining_duration != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + pcall_vc_satcall_info = (call_vc_satsetup_info_t *) &(pcall_agent->call_manager.setupcall_info.satcall_setup_info); + *remaining_duration = pcall_vc_satcall_info->remaining_duration; + CALL_ENG_DEBUG(ENG_DEBUG, "Remaining Duration: %ld", *remaining_duration); + + return ERROR_VOICECALL_NONE; +} +#endif + +voicecall_error_t _vc_core_engine_get_sat_dtmf_hidden_mode(voicecall_engine_t *pvoicecall_agent, gboolean *bhidden_mode) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_satsetup_info_t *pcall_vc_satcall_info = NULL; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(bhidden_mode != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + pcall_vc_satcall_info = (call_vc_satsetup_info_t *) &(pagent->call_manager.setupcall_info.satcall_setup_info); + + CALL_ENG_DEBUG(ENG_DEBUG, "SAT Hidden Mode= %d", pcall_vc_satcall_info->satengine_dtmf_data.bIsHiddenMode); + + *bhidden_mode = pcall_vc_satcall_info->satengine_dtmf_data.bIsHiddenMode; + return ERROR_VOICECALL_NONE; +} + +/** +* This function changes the voice audio path +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] audio_path audio path to be changed +* @remarks pvoicecall_agent cannot be NULL +*/ +voicecall_error_t _vc_core_engine_change_audio_path(voicecall_engine_t *pvoicecall_agent, voicecall_audio_path_t audio_path) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + tapi_sound_audio_path_t tapi_audio_path = TAPI_SOUND_HANDSET; + /*Enum for encapsulating errors from TAPI Lib */ + TapiResult_t tapi_error = TAPI_API_SUCCESS; + int ReqId = VC_RQSTID_DEFAULT; + + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*Voicecall Path Should not be modified if calls are not available */ + if (_vc_core_cm_get_call_member_count(&pcall_agent->call_manager) <= 0) { + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + } + + switch (audio_path) { + case VC_AUDIO_PATH_HANDSET: + { + tapi_audio_path = TAPI_SOUND_HANDSET; + } + break; + case VC_AUDIO_PATH_HEADSET: + { + tapi_audio_path = TAPI_SOUND_HEADSET; + } + break; + case VC_AUDIO_PATH_HANDSFREE: + { + tapi_audio_path = TAPI_SOUND_HANDSFREE; + } + break; + case VC_AUDIO_PATH_BLUETOOTH: + { + tapi_audio_path = TAPI_SOUND_BLUETOOTH; + } + break; + case VC_AUDIO_PATH_STEREO_BLUETOOTH: + { + tapi_audio_path = TAPI_SOUND_STEREO_BLUETOOTH; + } + break; + case VC_AUDIO_PATH_SPK_PHONE: + { + tapi_audio_path = TAPI_SOUND_SPK_PHONE; + } + break; + case VC_AUDIO_PATH_HEADSET_3_5PI: + { + tapi_audio_path = TAPI_SOUND_HEADSET_3_5PI; + } + break; + default: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Invalid audio path"); + return ERROR_VOICECALL_INVALID_ARGUMENTS; + } + break; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "tapi_audio_path: %d", tapi_audio_path); + tapi_error = tel_set_sound_path(tapi_audio_path, &ReqId); + + if (tapi_error != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_set_sound_path error: %d", tapi_error); + return ERROR_VOICECALL_TAPI_ERROR; + } + + return ERROR_VOICECALL_NONE; +} + +voicecall_error_t _vc_core_engine_set_audio_mute(voicecall_engine_t *pvoicecall_agent, gboolean bmute_audio) +{ + TapiResult_t error = TAPI_API_SUCCESS; + tapi_sound_mic_mute_t micmute_set = TAPI_SOUND_MIC_UNMUTE; + int req_id = VC_RQSTID_DEFAULT; + + micmute_set = (TRUE == bmute_audio) ? TAPI_SOUND_MIC_MUTE : TAPI_SOUND_MIC_UNMUTE; + + error = tel_set_sound_mute_status(micmute_set, &req_id); + + if (error != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_set_sound_mute_status Error: %d", error); + return ERROR_VOICECALL_TAPI_ERROR; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "End"); + return ERROR_VOICECALL_NONE; +} + +/** +* This function sets the voice call audio volume for the given audio path type +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] audio_path_type audio path for the volume to be set +* @param[in] vol_level volume level +* @remarks pvoicecall_agent cannot be NULL +*/ +voicecall_error_t _vc_core_engine_set_audio_volume(voicecall_engine_t *pvoicecall_agent, voicecall_audio_path_t audio_path_type, voicecall_audio_volume_t vol_level) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + /*Enum for encapsulating errors from TAPI Lib */ + TapiResult_t error = TAPI_API_SUCCESS; + tapi_sound_volume_control_t vol_control; + int ReqId = VC_RQSTID_DEFAULT; + + CALL_ENG_DEBUG(ENG_DEBUG, "Start! path(%d), volume(%d)", audio_path_type, vol_level); + + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(audio_path_type, VC_AUDIO_PATH_HANDSET, VC_AUDIO_PATH_HEADSET_3_5PI, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(vol_level, VC_AUDIO_VOLUME_LEVEL_0, VC_AUDIO_VOLUME_LEVEL_9, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*Ignore the request if calls are not available */ + if (_vc_core_cm_get_call_member_count(&pcall_agent->call_manager) <= 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "End"); + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + } + + vol_control.volume = vol_level; + switch (audio_path_type) { + case VC_AUDIO_PATH_HEADSET: + vol_control.vol_type = TAPI_SOUND_VOL_HEADSET_VOICE; + break; + case VC_AUDIO_PATH_BLUETOOTH: + case VC_AUDIO_PATH_STEREO_BLUETOOTH: + vol_control.vol_type = TAPI_SOUND_VOL_BT_VOICE; + break; + case VC_AUDIO_PATH_SPK_PHONE: + vol_control.vol_type = TAPI_SOUND_VOL_SPK_PHONE; + break; + default: + vol_control.vol_type = TAPI_SOUND_VOL_VOICE; + break; + } + + error = tel_set_sound_volume_info(vol_control, &ReqId); + + if (error != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "Tapi API Error: %d", error); + return ERROR_VOICECALL_TAPI_ERROR; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "End"); + return ERROR_VOICECALL_NONE; +} + +/** +* This function retreives the voice call audio volume for the given audio path type +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] audio_path_type audio path for the volume to be retreived +* @remarks pvoicecall_agent cannot be NULL +* The audio volume level will be send as a response with the below details +* event - VC_CALL_GET_VOLUME_RESP +* param1 - audio_path_type +* param2 - volume level +* param3 - NULL +*/ +voicecall_error_t _vc_core_engine_get_audio_volume(voicecall_engine_t *pvoicecall_agent, voicecall_audio_path_t audio_path_type) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + TapiResult_t error = TAPI_API_SUCCESS; + tapi_sound_volume_type_t volume_type = TAPI_SOUND_VOL_VOICE; + int ReqId = VC_RQSTID_DEFAULT; + + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(audio_path_type, VC_AUDIO_PATH_HANDSET, VC_AUDIO_PATH_HEADSET_3_5PI, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*Ignore the request if calls are not available */ + if (_vc_core_cm_get_call_member_count(&pcall_agent->call_manager) <= 0) { + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + } + + switch (audio_path_type) { + case VC_AUDIO_PATH_HEADSET: + volume_type = TAPI_SOUND_VOL_HEADSET_VOICE; + break; + case VC_AUDIO_PATH_BLUETOOTH: + case VC_AUDIO_PATH_STEREO_BLUETOOTH: + volume_type = TAPI_SOUND_VOL_BT_VOICE; + break; + case VC_AUDIO_PATH_SPK_PHONE: + volume_type = TAPI_SOUND_VOL_SPK_PHONE; + break; + default: + volume_type = TAPI_SOUND_VOL_VOICE; + break; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "volume_type = %d", volume_type); + + pcall_agent->curr_tapi_path = volume_type; + error = tel_get_sound_volume_info(volume_type, &ReqId); + + if (error != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "Tapi API Error: %d", error); + return ERROR_VOICECALL_TAPI_ERROR; + } + + return ERROR_VOICECALL_NONE; +} + +/** +* This function changes the inout state of the engine to the given state +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] io_state Inout state to be set +* @remarks pvoicecall_agent cannot be NULL +* @see _vc_core_engine_status_get_engine_iostate +*/ +voicecall_error_t _vc_core_engine_change_engine_iostate(voicecall_engine_t *pvoicecall_agent, int io_state) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_CALL_HANDLE); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(io_state, VC_INOUT_STATE_NONE, VC_INOUT_STATE_INCOME_END, ERROR_VOICECALL_INVALID_CALL_HANDLE); + + if (TRUE == _vc_core_ca_change_inout_state(pagent, (voicecall_inout_state_t) io_state)) { + return ERROR_VOICECALL_NONE; + } + + return ERROR_VOICECALL_INVALID_ARGUMENTS; +} + +voicecall_error_t _vc_core_engine_extract_phone_number(const char *source_tel_number, char *phone_number, const int buf_size) +{ + VOICECALL_RETURN_VALUE_IF_FAIL(source_tel_number != NULL, ERROR_VOICECALL_INVALID_CALL_HANDLE); + VOICECALL_RETURN_VALUE_IF_FAIL(phone_number != NULL, ERROR_VOICECALL_INVALID_CALL_HANDLE); + + if (FALSE == _vc_core_util_extract_call_number(source_tel_number, phone_number, buf_size)) { + _vc_core_util_strcpy(phone_number, buf_size, source_tel_number); + } + + return ERROR_VOICECALL_NONE; +} + +voicecall_error_t _vc_core_engine_set_to_default_values(voicecall_engine_t *pvoicecall_agent) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + + CALL_ENG_DEBUG(ENG_DEBUG, "Start"); + /*Initialize Call Manager */ + _vc_core_call_manager_init(&pcall_agent->call_manager); + + /* Initialize Call Agent Flags */ + _vc_core_ca_init_data(pcall_agent); + +#ifdef _CCBS_DEFINED_ + /* Init CCBS Info */ + _vc_core_init_ccbs_info(pcall_agent); +#endif + + /* Init CPHS Info */ +#ifdef _CPHS_DEFINED_ + _vc_core_svcall_init_cphs_info(pcall_agent); +#endif + + CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager); + CALL_ENG_DEBUG(ENG_DEBUG, "End"); + + return ERROR_VOICECALL_NONE; +} diff --git a/call-engine/core/vc-core-svcall.c b/call-engine/core/vc-core-svcall.c new file mode 100755 index 0000000..93f0137 --- /dev/null +++ b/call-engine/core/vc-core-svcall.c @@ -0,0 +1,280 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifdef _CPHS_DEFINED_ + +#include +#include +#include "vc-core-engine.h" +#include "vc-core-svcall.h" +#include "vc-core-util.h" +#include "tapi-inc.h" +#include "status-interface.h" + +/*Local Function Decleration*/ +/** +* This function checks whether csp is enabled in the cphs group +* +* @internal +* @return TRUE if customer service profile is enabled -FALSE otherwise +* @param[in] pcall_agent Handle to Voicecall Call Agent +*/ +static gboolean __call_vcsv_cphs_is_csp_enabled(call_vc_callagent_state_t *pcall_agent); + +/** +* This function returns the csp index of the given csp service from the cphs cspprofile +* +* @internal +* @return index to the specified csp service +* @param[in] pcphs_csp_profile Handle to csp profile entry table +* @param[in] csp_group_max_count maximumm service entry +* @param[in] csp_service csp service to be found +*/ +static int __call_vcsv_cphs_find_csp_index(TelSimCphsCustomerServiceProfileEntry_t *pcphs_csp_profile, int csp_group_max_count, TelSimCphsCustomerServiceGroup_t csp_service); + +/** + * This function retrieves cphs information from the Telephony and stores with the engine + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Handle to Voicecall Call Agent + */ +gboolean _vc_core_svcall_init_cphs_info(call_vc_callagent_state_t *pcall_agent) +{ + gboolean ret_val = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + memset(&pcall_agent->cphs_status, 0, sizeof(status_class_cphs_type)); + + /*Read CPHS Info */ +#ifdef _CPHS_DEFINED_ + ret_val = nps_get_cphs_status(&pcall_agent->cphs_status); +#endif + + if (FALSE == ret_val) { + CALL_ENG_DEBUG(ENG_DEBUG, "nps_get_cphs_status failed or CPHS feature not enabled"); + pcall_agent->bcphs_read_success = FALSE; + return FALSE; + } + + pcall_agent->bcphs_read_success = TRUE; + + return TRUE; +} + +/** + * This function retrieves status of the given csp service type + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] csp_service csp service whose status to be retreived + */ +gboolean _vc_core_svcall_cphs_csp_get_status(call_vc_callagent_state_t *pcall_agent, voicecall_cphs_csp_service csp_service) +{ + status_class_cphs_type *pcphs_status_info = (status_class_cphs_type *) &pcall_agent->cphs_status; + int csp_index = -1; + + if (FALSE == __call_vcsv_cphs_is_csp_enabled(pcall_agent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "CPHS CSP Not enabled"); + + if (VC_CPHS_CSP_ALS == csp_service) { + return FALSE; + } else { + /*If CPHS is not supported, then by default return TRUE for the client to have default action */ + return TRUE; + } + } + + switch (csp_service) { + case VC_CPHS_CSP_ALS: /*CPHS Teleservices */ + { + csp_index = __call_vcsv_cphs_find_csp_index(pcphs_status_info->csp.serviceProfileEntry, TAPI_SIM_CPHS_CUSTOMER_SERVICE_PROFILE_ENTRY_COUNT_MAX, TAPI_SIM_CPHS_CSP_SERVICE_GROUP_CPHS_TELESERVICES); + } + break; + case VC_CPHS_CSP_HOLD: /*Call Completion Services */ + case VC_CPHS_CSP_CW: + case VC_CPHS_CSP_CBS: + case VC_CPHS_CSP_UUS: + { + csp_index = __call_vcsv_cphs_find_csp_index(pcphs_status_info->csp.serviceProfileEntry, TAPI_SIM_CPHS_CUSTOMER_SERVICE_PROFILE_ENTRY_COUNT_MAX, TAPI_SIM_CPHS_CSP_SERVICE_GROUP_CALL_COMPLETION); + } + break; + case VC_CPHS_CSP_CT: /*Call Offering Services */ + case VC_CPHS_CSP_CFU: + case VC_CPHS_CSP_CFB: + case VC_CPHS_CSP_CFNRY: + case VC_CPHS_CSP_CFNRC: + { + csp_index = __call_vcsv_cphs_find_csp_index(pcphs_status_info->csp.serviceProfileEntry, TAPI_SIM_CPHS_CUSTOMER_SERVICE_PROFILE_ENTRY_COUNT_MAX, TAPI_SIM_CPHS_CSP_SERVICE_GROUP_CALL_OFFERING); + } + break; + case VC_CPHS_CSP_MPTY: /*Other Supplementary Services */ + case VC_CPHS_CSP_CUG: + case VC_CPHS_CSP_AOC: + case VC_CPHS_CSP_PREFCUG: + case VC_CPHS_CSP_CUGOA: + { + csp_index = __call_vcsv_cphs_find_csp_index(pcphs_status_info->csp.serviceProfileEntry, TAPI_SIM_CPHS_CUSTOMER_SERVICE_PROFILE_ENTRY_COUNT_MAX, TAPI_SIM_CPHS_CSP_SERVICE_GROUP_OTHER_SUPP_SERVICES); + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "No Actions defined for service type: %d", csp_service); + break; + } + + if (-1 == csp_index) { + CALL_ENG_DEBUG(ENG_DEBUG, "csp_index failed for csp service: %d", csp_service); + return FALSE; + } + + switch (csp_service) { + case VC_CPHS_CSP_ALS: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.cphsTeleservices.bAlternativeLineService; + } + break; + case VC_CPHS_CSP_HOLD: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.callComplete.bCallHold; + } + break; + case VC_CPHS_CSP_CW: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.callComplete.bCallWaiting; + } + break; + case VC_CPHS_CSP_CBS: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.callComplete.bCompletionOfCallToBusySubscriber; + } + break; + case VC_CPHS_CSP_UUS: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.callComplete.bUserUserSignalling; + } + break; + case VC_CPHS_CSP_CFU: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.callOffering.bCallForwardingUnconditional; + } + break; + case VC_CPHS_CSP_CFB: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.callOffering.bCallForwardingOnUserBusy; + } + break; + case VC_CPHS_CSP_CFNRY: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.callOffering.bCallForwardingOnNoReply; + } + break; + case VC_CPHS_CSP_CFNRC: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.callOffering.bCallForwardingOnUserNotReachable; + } + break; + case VC_CPHS_CSP_CT: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.callOffering.bCallTransfer; + } + break; + case VC_CPHS_CSP_MPTY: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.otherSuppServices.bMultiPartyService; + } + break; + case VC_CPHS_CSP_CUG: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.otherSuppServices.bClosedUserGroup; + } + break; + case VC_CPHS_CSP_AOC: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.otherSuppServices.bAdviceOfCharge; + } + break; + case VC_CPHS_CSP_PREFCUG: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.otherSuppServices.bPreferentialClosedUserGroup; + } + break; + case VC_CPHS_CSP_CUGOA: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.otherSuppServices.bPreferentialClosedUserGroup; + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Action not defined for csp service: %d", csp_service); + return FALSE; + } + + return FALSE; +} + +voice_call_cphs_alsline_t _vc_core_svcall_get_cphs_als_active_line(call_vc_callagent_state_t *pcall_agent) +{ + status_class_cphs_type *pcphs_status_info = (status_class_cphs_type *) &pcall_agent->cphs_status; + + if (FALSE == __call_vcsv_cphs_is_csp_enabled(pcall_agent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "CPHS CSP Not enabled"); + return VC_CALL_CPHS_ALS_LINE1; + } + + if (TAPI_SIM_DYNAMIC_FLAGS_LINE1 == pcphs_status_info->dflagsinfo.dynamicFlags) { + return VC_CALL_CPHS_ALS_LINE1; + } else if (TAPI_SIM_DYNAMIC_FLAGS_LINE2 == pcphs_status_info->dflagsinfo.dynamicFlags) { + return VC_CALL_CPHS_ALS_LINE2; + } + + return VC_CALL_CPHS_ALS_LINE1; + +} + +/*Local Function Decleration*/ +static gboolean __call_vcsv_cphs_is_csp_enabled(call_vc_callagent_state_t *pcall_agent) +{ + status_class_cphs_type *pnps_cphs_status = NULL; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + if (pcall_agent->bcphs_read_success == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "CSP Status not read"); + return FALSE; + } + + pnps_cphs_status = &pcall_agent->cphs_status; + + if (FALSE == pnps_cphs_status->cphsinfo.CphsServiceTable.bCustomerServiceProfile) { + return TRUE; + } + + return FALSE; +} + +static int __call_vcsv_cphs_find_csp_index(TelSimCphsCustomerServiceProfileEntry_t *pcphs_csp_profile, int csp_group_max_count, TelSimCphsCustomerServiceGroup_t csp_service) +{ + int index = 0; + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + for (index = 0; index < csp_group_max_count; index++) { + if (pcphs_csp_profile[index].customerServiceGroup == csp_service) { + return index; + } + } + + return VC_ERROR; +} +#endif /*_CPHS_DEFINED_*/ diff --git a/call-engine/core/vc-core-tapi-evnt.c b/call-engine/core/vc-core-tapi-evnt.c new file mode 100755 index 0000000..e0a3b88 --- /dev/null +++ b/call-engine/core/vc-core-tapi-evnt.c @@ -0,0 +1,1498 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include "vc-core-tapi-evnt.h" +#include "vc-core-callmanager.h" +#include "vc-core-util.h" +#include "vc-core-tapi-rqst.h" + +static int barring_ind_type = VC_BARR_IND_NONE; + +/** +* This function processes the current io wait states if available +* +* @internal +* @return if wait states are processed, FALSE otherwise +* @param[in] pcall_agent handle to voicecall agent structure +*/ +static gboolean __call_vc_process_wait_state_success_events(call_vc_callagent_state_t *pcall_agent); + +/** +* This function requests the TAPI for the ppm value for callcost +* +* @internal +* @return void +* @param[in] pcall_agent handle to voicecall agent structure +*/ +static void __call_vc_get_aoc_ppm_value(call_vc_callagent_state_t *pcall_agent); +static gboolean __call_vc_get_aoc_ppm_value_idle_cb(gpointer pdata); +static gboolean __call_vc_download_call_timer_cb(gpointer pdata); + +/** + * This function retreives the voicecall engine specific end cause type for the given TAPI end cause type + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] type TAPI event type + * @param[in] cause TAPI call end cause + * @param[out] end_cause_type voicecall engine end cause + */ +void _vc_core_tapi_event_get_end_cause_type(int type, TelTapiEndCause_t cause, voice_call_end_cause_type_t *end_cause_type) +{ + VOICECALL_RETURN_IF_FAIL(end_cause_type != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "EventType:[0x%x],EndCause:%d", type, cause); + + switch (type) { + case TAPI_EVENT_CALL_END_IND: + /*case TAPI_EVENT_ERR:*/ + switch (cause) { + case TAPI_CC_CAUSE_NORMAL_UNSPECIFIED: + *end_cause_type = VC_ENDCAUSE_CALL_DISCONNECTED; + break; + case TAPI_CC_CAUSE_FACILITY_REJECTED: + *end_cause_type = VC_ENDCAUSE_CALL_FAILED; + break; + case TAPI_CC_CAUSE_QUALITY_OF_SERVICE_UNAVAILABLE: + case TAPI_CC_CAUSE_ACCESS_INFORMATION_DISCARDED: + case TAPI_CC_CAUSE_BEARER_CAPABILITY_NOT_AUTHORISED: + case TAPI_CC_CAUSE_BEARER_CAPABILITY_NOT_PRESENTLY_AVAILABLE: + case TAPI_CC_CAUSE_SERVICE_OR_OPTION_NOT_AVAILABLE: + case TAPI_CC_CAUSE_BEARER_SERVICE_NOT_IMPLEMENTED: + case TAPI_CC_CAUSE_PROTOCOL_ERROR_UNSPECIFIED: + + *end_cause_type = VC_ENDCAUSE_CALL_ENDED; + break; + + case TAPI_CC_CAUSE_REQUESTED_FACILITY_NOT_SUBSCRIBED: + *end_cause_type = VC_ENDCAUSE_CALL_SERVICE_NOT_ALLOWED; + break; + + case TAPI_CC_CAUSE_OPERATOR_DETERMINED_BARRING: + *end_cause_type = VC_ENDCAUSE_CALL_BARRED; + break; + case TAPI_REJECT_CAUSE_MM_REJ_NO_SERVICE: + *end_cause_type = VC_ENDCAUSE_NO_SERVICE; + break; + + case TAPI_REJECT_CAUSE_CONGESTTION: + case TAPI_REJECT_CAUSE_CNM_REJ_NO_RESOURCES: + case TAPI_CC_CAUSE_SWITCHING_EQUIPMENT_CONGESTION: /*Match as NW_BUSY*/ + *end_cause_type = VC_ENDCAUSE_NW_BUSY; + break; + + case TAPI_REJECT_CAUSE_NETWORK_FAILURE: + case TAPI_REJECT_CAUSE_MSC_TEMPORARILY_NOT_REACHABLE: + *end_cause_type = VC_ENDCAUSE_NW_FAILED; + break; + + case TAPI_REJECT_CAUSE_IMEI_NOT_ACCEPTED: + { + unsigned long mcc = 0; + + _vc_core_util_get_mcc(&mcc); + + if (mcc == CALL_NETWORK_MCC_UK) { + *end_cause_type = VC_ENDCAUSE_IMEI_REJECTED; /*Display "Please verify SIM or insert valid SIM"*/ + } else { + *end_cause_type = VC_ENDCAUSE_NW_FAILED; /*Display Network unavailable*/ + } + } + break; + + case TAPI_CC_CAUSE_NO_ROUTE_TO_DEST: + case TAPI_CC_CAUSE_TEMPORARY_FAILURE: + case TAPI_CC_CAUSE_NETWORK_OUT_OF_ORDER: + case TAPI_CC_CAUSE_REQUESTED_CIRCUIT_CHANNEL_NOT_AVAILABLE: + case TAPI_CC_CAUSE_NO_CIRCUIT_CHANNEL_AVAILABLE: + case TAPI_CC_CAUSE_DESTINATION_OUT_OF_ORDER: + *end_cause_type = VC_ENDCAUSE_SERVICE_TEMP_UNAVAILABLE; + break; + + case TAPI_CC_CAUSE_NO_USER_RESPONDING: + case TAPI_CC_CAUSE_USER_ALERTING_NO_ANSWER: + *end_cause_type = VC_ENDCAUSE_USER_DOESNOT_RESPOND; + break; + + case TAPI_CC_CAUSE_ACM_GEQ_ACMMAX: + *end_cause_type = VC_ENDCAUSE_NO_CREDIT; + break; + + case TAPI_CC_CAUSE_CALL_REJECTED: + if (barring_ind_type == VC_BARR_IND_ALL) + *end_cause_type = VC_ENDCAUSE_CALL_BARRED; + else + *end_cause_type = VC_ENDCAUSE_USER_UNAVAILABLE; + + barring_ind_type = VC_BARR_IND_NONE; + break; + + case TAPI_CC_CAUSE_USER_BUSY: + *end_cause_type = VC_ENDCAUSE_USER_BUSY; + break; + + case TAPI_CC_CAUSE_USER_NOT_MEMBER_OF_CUG: + *end_cause_type = VC_ENDCAUSE_WRONG_GROUP; + break; + + case TAPI_CC_CAUSE_INVALID_NUMBER_FORMAT: + + *end_cause_type = VC_ENDCAUSE_INVALID_NUMBER_FORMAT; + break; + + case TAPI_CC_CAUSE_UNASSIGNED_NUMBER: + *end_cause_type = VC_ENDCAUSE_UNASSIGNED_NUMBER; + break; + + case TAPI_CC_CAUSE_NUMBER_CHANGED: + *end_cause_type = VC_ENDCAUSE_NUMBER_CHANGED; + break; + + case TAPI_CALL_END_NO_CAUSE: + default: + *end_cause_type = VC_ENDCAUSE_CALL_ENDED; + + CALL_ENG_DEBUG(ENG_ERR, "Call Ended or Default Cause Value: %d", cause); + break; + } + break; + default: + *end_cause_type = VC_ENDCAUSE_CALL_FAILED; + CALL_ENG_DEBUG(ENG_DEBUG, "Invalid call end cause or error !!"); + break; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Engine End Cause: %d", (int)*end_cause_type); +} + +void _vc_core_tapi_event_copy_incoming_call_data(call_vc_callagent_state_t *pcall_agent, TelCallIncomingCallInfo_t *callInfo, call_vc_call_objectinfo_t *pcallobject_info) +{ +#ifdef _CPHS_DEFINED_ + if (_vc_core_svcall_cphs_csp_get_status(pcall_agent, VC_CPHS_CSP_ALS)) { + TelCallActiveLine_t activeLine = callInfo->ActiveLine; + + if (activeLine == TAPI_CALL_ACTIVE_LINE1) { + pcallobject_info->alsLine = VC_CALL_CPHS_ALS_LINE1; + } else if (activeLine == TAPI_CALL_ACTIVE_LINE2) { + pcallobject_info->alsLine = VC_CALL_CPHS_ALS_LINE2; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "undefined currentLine=%d", activeLine); + } + } +#endif + + _vc_core_util_strcpy(pcallobject_info->calling_name, sizeof(pcallobject_info->calling_name), callInfo->CallingNameInfo.szNameData); + pcallobject_info->bcalling_namemode = callInfo->CallingNameInfo.NameMode; + + /* If BCD number exists, number should be shown even though number restriction is set */ + if (strlen(callInfo->szCallingPartyNumber) > 0) { + pcallobject_info->brestricted_namemode = FALSE; + + if (callInfo->szCallingPartyNumber[0] == '*') { + pcallobject_info->bccbs_call = TRUE; + _vc_core_util_strcpy(pcallobject_info->tel_number, sizeof(pcallobject_info->tel_number), callInfo->szCallingPartyNumber + 1); + } else { + _vc_core_util_strcpy(pcallobject_info->tel_number, sizeof(pcallobject_info->tel_number), callInfo->szCallingPartyNumber); + } + + /*mkjung_2007.12.19: check callInfo->name_mode if override category isn't supported.*/ + } else { /* If BCD number doesn't exist, cause_of_no_cli value should be checked to decide its presentation */ + + pcallobject_info->brestricted_namemode = TRUE; + + pcallobject_info->name_mode = callInfo->CliCause; + + CALL_ENG_DEBUG(ENG_DEBUG, "no_cli_cause = %d, name_mode = %d...", callInfo->CliCause, pcallobject_info->name_mode); + } +} + +/** + * This function handles the incoming event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle Incoming call handle + * @param[in] callInfo Incoming call info associated with the incoming call + */ +gboolean _vc_core_tapi_event_handle_incoming_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallIncomingCallInfo_t *callInfo) +{ + call_vc_call_objectinfo_t callobject_info; + int callIndex; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, number = %s..", call_handle, callInfo->szCallingPartyNumber); + + /* setting the new member info */ + _vc_core_cm_clear_call_object(&callobject_info); + + callobject_info.call_handle = call_handle; + callobject_info.call_id = _vc_core_cm_get_new_callId(&pcall_agent->call_manager); + callobject_info.bincoming_call_is_fwded = callInfo->fwded; + + /* setting the incom call telephone number */ + CALL_ENG_DEBUG(ENG_DEBUG, "[callobject_info.call_handle=%d], FWDED Call: %d", callobject_info.call_handle, callobject_info.bincoming_call_is_fwded); + + /*Copy Incoming call data in to the callobject */ + _vc_core_tapi_event_copy_incoming_call_data(pcall_agent, callInfo, &callobject_info); + + /*Change the Call Object Call State*/ + _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_INCOME); + + /*Add the newly created callobject to the Call Manager*/ + callIndex = _vc_core_cm_add_call_object(&pcall_agent->call_manager, &callobject_info); + if (callIndex != -1) { + /*Set the Call Manager's MT Call Index as CallObject Index*/ + if (FALSE == _vc_core_cm_set_incoming_call(&pcall_agent->call_manager, callIndex)) { + CALL_ENG_DEBUG(ENG_ERR, "Problem in accpeting the incoming call, Current Call Details"); + CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager); + return FALSE; + } + } else { + CALL_ENG_DEBUG(ENG_ERR, "Problem in adding the call to the call manager"); + CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager); + } + + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_START); + + return TRUE; +} + +/** + * This function handles TAPI alert event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle Call Handle associated with the alert event + */ +gboolean _vc_core_tapi_event_handle_alert_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + /* Verify call handle */ + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d", call_handle); + + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_ERR, "INVALID_CALLHANDLE Error"); + return FALSE; + } + + _vc_core_cm_change_call_object_state(&pcall_agent->call_manager, call_handle, VC_CALL_STATE_OUTGOING_ALERT); + + /* Change Inout state to "wait connected" before sending event to client so the same state is + reflected in client side also */ + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED); + + /*Send Alert Event to Client*/ + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_OUTGOING_ALERT, call_handle, 0, NULL); + return TRUE; +} + +/** + * This function handles TAPI origination event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle Call Handle associated with the alert event + */ +gboolean _vc_core_tapi_event_handle_originated_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(call_handle > 0); + + /* Verify call handle */ + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d", call_handle); + + _vc_core_cm_change_call_object_state(&pcall_agent->call_manager, call_handle, VC_CALL_STATE_OUTGOING_ORIG); + + /* Send Alert Event to Client */ + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_OUTGOING_ORIG, call_handle, 0, NULL); + + /* Change Inout state to "wait Alert" */ + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_WAIT_ALERT); + + /* SAT's request... send response here.. not connected ind. + Disable checking gcf status. 20090806*/ +#ifndef _vc_core_ca_send_sat_response_ORIG + if (TRUE == _vc_core_util_check_gcf_status()) +#endif + { + call_vc_call_objectinfo_t callobject_info; + + _vc_core_cm_clear_call_object(&callobject_info); + + /*Process Connected Event*/ + /* Get the member info and chage info */ + _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info); + + if (callobject_info.call_type == VC_CALL_ORIG_TYPE_SAT) { + _vc_core_ca_send_sat_response(pcall_agent, SAT_RQST_SETUP_CALL, CALL_VC_ME_RET_SUCCESS); + } + } + + return TRUE; +} + +/** + * This function handles the call end event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] type TAPI Event Type + * @param[in] handle Call Handle of the call being ended + * @param[in] cause TAPI End Cause + */ +gboolean _vc_core_tapi_event_handle_call_end_event(call_vc_callagent_state_t *pcall_agent, int type, call_vc_handle handle, TelTapiEndCause_t cause) +{ + gboolean active_call = FALSE; + gboolean held_call = FALSE; + int error_code = 0; + call_vc_call_objectinfo_t callobject_info; + voicecall_call_state_t prev_callstate; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + _vc_core_cm_get_call_object(&pcall_agent->call_manager, handle, &callobject_info); + + prev_callstate = callobject_info.state; + + _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_ENDED); + + /* set end cause text*/ + _vc_core_tapi_event_get_end_cause_type(type, cause, &callobject_info.end_cause_type); + + /*Set the modified CallObject to the Call Manager*/ + _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info); + + /*All calls are disconnected, so stop call timer*/ + if (_vc_core_cm_isexists_connected_call(&pcall_agent->call_manager) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Connected Call Exist"); + } + + active_call = _vc_core_cm_isexists_active_call(&pcall_agent->call_manager); + held_call = _vc_core_cm_isexists_held_call(&pcall_agent->call_manager); + + switch (pcall_agent->callagent_state) { + case CALL_VC_CA_STATE_WAIT_JOIN: + if ((FALSE == active_call) || (FALSE == held_call)) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + break; + case CALL_VC_CA_STATE_WAIT_HOLD: + if (FALSE == active_call) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + break; + case CALL_VC_CA_STATE_WAIT_UNHOLD: + if (FALSE == held_call) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + break; + case CALL_VC_CA_STATE_WAIT_SWAP: + if ((FALSE == active_call) || (FALSE == held_call)) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + break; + case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_ACTIVECALL: +#ifdef AUTO_RETREIVE_HELD_CALL + if (FALSE == active_call) { + /* todo call: IF Ear MIC is Inserted && */ + if ((TRUE == held_call) && (pcall_agent->io_state == VC_INOUT_STATE_NONE) && \ + (TRUE == _vc_core_tapi_rqst_retrieve_call(pcall_agent))) { + _vc_core_cm_clear_endcall_member(&pcall_agent->call_manager); + + _vc_core_ca_send_event_to_client(pcall_agent, VC_ACTION_CALL_END_HELD_RETREIVED, handle, 0, NULL); + + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_UNHOLD); + } else { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + } +#else + if (FALSE == active_call) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Still Active Calls are available"); + } +#endif + break; + case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_HOLDCALL: + if (FALSE == held_call) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + break; + case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS: + if ((active_call == FALSE) && (held_call == FALSE)) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + break; + case CALL_VC_CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL: + CALL_ENG_DEBUG(ENG_DEBUG, "Retrieve held call on active call end"); + if (FALSE == active_call) { + if ((TRUE == held_call) && (TRUE == _vc_core_tapi_rqst_retrieve_call(pcall_agent))) { + _vc_core_cm_clear_endcall_member(&pcall_agent->call_manager); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ACTION_CALL_END_HELD_RETREIVED, handle, 0, NULL); + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_UNHOLD); + } else { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + } + break; + case CALL_VC_CA_STATE_WAIT_DROP: + if (VC_CALL_STATE_RELEASE_WAIT == prev_callstate) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + + break; + + case CALL_VC_CA_STATE_SPLIT_CALLBOX: + case CALL_VC_CA_STATE_DROP_CALLBOX: + case CALL_VC_CA_STATE_SENDMSG_CALLBOX: + case CALL_VC_CA_STATE_SAVE_TO_CONTACT_CALLBOX: + case CALL_VC_CA_STATE_VIEW_CONTACT_DETAIL_CALLBOX: + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + break; + case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SWITCH_TO_VIDEO_CALL: + if ((FALSE == active_call) && (FALSE == held_call)) { + char tel_number[VC_PHONE_NUMBER_LENGTH_MAX]; + + memset(tel_number, 0, VC_PHONE_NUMBER_LENGTH_MAX); + } + break; + case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SETUP: + { + if ((active_call == FALSE) && (held_call == FALSE)) { + call_vc_call_objectinfo_t callInfo; + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + if (_vc_core_tapi_rqst_setup_call(pcall_agent) == FALSE) { + if (_vc_core_cm_get_outgoing_call_info(&pcall_agent->call_manager, &callInfo)) { + /*Send response only if call type is sat */ + if (callInfo.call_type == VC_CALL_ORIG_TYPE_SAT) { + CALL_ENG_DEBUG(ENG_DEBUG, "SAT_CALL fail to setup call"); + _vc_core_ca_send_sat_response(pcall_agent, SAT_RQST_SETUP_CALL, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + } + } + break; + } + + /*Update CallManager State */ + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_WAIT_ORIG); + call_handle = _vc_core_cm_get_outgoing_call_handle(&pcall_agent->call_manager); + CALL_ENG_DEBUG(ENG_DEBUG, "Deffered Outgoing Call Handle = %d", call_handle); + + /*Inform Client about the Deferred Outgoing */ + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_OUTGOING, call_handle, 0, NULL); + } + } + break; + case CALL_VC_CA_STATE_WAIT_TRANSFER_CNF: + { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + CALL_ENG_DEBUG(ENG_DEBUG, "Waiting transfer canceled!"); + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Action not defined for this call agent state:%d", pcall_agent->callagent_state); + } + + /* if waiting call end for mtc */ + switch (pcall_agent->io_state) { + case VC_INOUT_STATE_INCOME_WAIT_HOLD: + + if (active_call == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "call to hold is disconnected..proceed to answer call"); + /*It will be better to show end of call + _vc_core_tapi_rqst_answer_call( pcall_agent);*/ + } + + break; + + case VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVECALL: + if (active_call == FALSE) { + /*_vc_core_tapi_rqst_answer_call( pcall_agent);*/ + } + break; + case VC_INOUT_STATE_INCOME_WAIT_RELEASE_HOLDCALL: + if (held_call == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Answering call after ending held calls"); + + /*Change the state to Income box, so the answer API will process it */ + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_BOX); + + /* end held call and then accept incoming call */ + _vc_core_tapi_rqst_answer_call(pcall_agent, VC_ANSWER_HOLD_ACTIVE_AND_ACCEPT, &error_code); + } + break; +#ifdef RELEASE_ALL_AND_ACCEPT_SUPPORT + case VC_INOUT_STATE_INCOME_WAIT_RELEASE_HOLDCALL_FOR_ALL_RELEASE: + if (held_call == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Answering(rel and accept) call after ending held calls"); + + /*Change the state to Income box, so the answer API will process it */ + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_BOX); + + /* end held call and then accept incoming call */ + _vc_core_tapi_rqst_answer_call(pcall_agent, VC_ANSWER_RELEASE_ACTIVE_AND_ACCEPT, &error_code); + } + break; +#endif + case VC_INOUT_STATE_OUTGOING_WAIT_HOLD: + _vc_core_cm_clear_outgoing_call(&pcall_agent->call_manager); + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_ABORTED); + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "No Actions defined for IO State: %d", pcall_agent->io_state); + } + + if (VC_CALL_ORIG_TYPE_SAT == callobject_info.call_type) { + if (pcall_agent->call_manager.setupcall_info.satcall_setup_info.psat_rgb_data != NULL) { + free(pcall_agent->call_manager.setupcall_info.satcall_setup_info.psat_rgb_data); + pcall_agent->call_manager.setupcall_info.satcall_setup_info.psat_rgb_data = NULL; + } + } + + return TRUE; +} + +static gboolean __call_vc_process_wait_state_success_events(call_vc_callagent_state_t *pcall_agent) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + switch (pcall_agent->io_state) { + case VC_INOUT_STATE_INCOME_WAIT_HOLD_CONNECTED: + { + int grp_index; + call_vc_handle active_handle = VC_TAPI_INVALID_CALLHANDLE; + + if (pcall_agent->callagent_state == CALL_VC_CA_STATE_WAIT_HOLD) { + CALL_ENG_DEBUG(ENG_DEBUG, "Separate HOLD_CNF event not arrived for HOLD and ACCEPT request, holding the call in the CONNECTED event"); + grp_index = _vc_core_cm_get_active_group_index(&pcall_agent->call_manager); + + if (-1 == grp_index) { + CALL_ENG_DEBUG(ENG_DEBUG, " ERROR:No Active Grp Index :grp_index = %d, Active state has been already held, check io state", grp_index); + return TRUE; + } + + _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &active_handle); + + _vc_core_cm_set_group_state(&pcall_agent->call_manager, grp_index, CALL_VC_GROUP_STATE_HOLD); + + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_HELD, active_handle, 0, NULL); + + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_CONNECTED); + } + } + break; + +#ifdef _INCOME_WAIT_CONNECTED_ + /*currently not applied, Fix to change the group state to hold, if the second call is connected before getting the holdcnf resp from tapi */ + case VC_INOUT_STATE_INCOME_WAIT_CONNECTED: + { + /*Check for incoming call exists */ + if (VC_INVALID_CALL_INDEX == pcall_agent->call_manager.mtcall_index) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Incoming call exists"); + return TRUE; + } + + if (0 == _vc_core_cm_get_connected_member_count_ingroup(&pcall_agent->call_manager, 0)) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Previous Connected Members"); + return TRUE; + } + + /*Connected Event for the incoming call is arrived, when waiting for hold confirmation + So change the active call state to hold before processing the connected indication */ + if (CALL_VC_CA_STATE_WAIT_HOLD == pcall_agent->callagent_state) { + int grp_index; + /*call_vc_handle active_handle =TAPI_INVALID_CALLHANDLE;*/ + grp_index = _vc_core_cm_get_active_group_index(&pcall_agent->call_manager); + + if (-1 == grp_index) { + CALL_ENG_DEBUG(ENG_DEBUG, " ERROR:No Active Grp Index :grp_index = %d, Active state has been already held, check io state", grp_index); + return TRUE; + } + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + /*_vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager,&active_handle);*/ + _vc_core_cm_set_group_state(&pcall_agent->call_manager, grp_index, CALL_VC_GROUP_STATE_HOLD); + } + else if (CALL_VC_CA_STATE_WAIT_UNHOLD == pcall_agent->callagent_state) { + int grp_index; + call_vc_handle held_handle = VC_TAPI_INVALID_CALLHANDLE; + grp_index = _vc_core_cm_get_held_group_index(&pcall_agent->call_manager); + if (-1 == grp_index) { + CALL_ENG_DEBUG(ENG_DEBUG, " ERROR:No Active Grp Index :grp_index = %d, Active state has been already held, check io state", grp_index); + return TRUE; + } + _vc_core_cm_get_first_held_call_handle(&pcall_agent->call_manager, &held_handle); + _vc_core_cm_set_group_state(&pcall_agent->call_manager, grp_index, CALL_VC_GROUP_STATE_ACTIVE); + + } + } + break; +#endif + case VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVE_CONNECTED: + { + call_vc_handle active_handle = VC_TAPI_INVALID_CALLHANDLE;; + CALL_ENG_DEBUG(ENG_DEBUG, "VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVE_CONNECTED"); + _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &active_handle); + CALL_ENG_DEBUG(ENG_DEBUG, "Active Call Handle = %d", active_handle); + + /*_vc_core_tapi_event_handle_call_end_event(pcall_agent, TAPI_EVENT_CALL_END, active_handle, TAPI_CALL_END_NO_CAUSE);*/ + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Action not defined for this wait io state: %d", pcall_agent->io_state); + } + + return TRUE; +} + +/** + * This function handles the TAPI call connect event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle call handle assoicated with the call being connected + */ +gboolean _vc_core_tapi_event_handle_call_connect_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle) +{ + call_vc_call_objectinfo_t callobject_info; + int index; + int connectednum = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + /* Verify call handle */ + CALL_ENG_DEBUG(ENG_DEBUG, "Started, Call Handle = %d", call_handle); + + _vc_core_cm_clear_call_object(&callobject_info); + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_ERR, "INVALID_CALLHANDLE Error"); + return FALSE; + } + + /*First Process the wait state events before processing the connect event */ + CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager); + __call_vc_process_wait_state_success_events(pcall_agent); + CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager); + + /*Process Connected Event*/ + /* Get the member info and chage info */ + _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info); + + /* + ** Reqeust from SAT. When GCF field is ON, send response when get a setup confirm. + ** To send response to SAT faster... + */ +#ifndef _vc_core_ca_send_sat_response_ORIG + if (FALSE == _vc_core_util_check_gcf_status()) { + if (callobject_info.call_type == VC_CALL_ORIG_TYPE_SAT) { + _vc_core_ca_send_sat_response(pcall_agent, SAT_RQST_SETUP_CALL, CALL_VC_ME_RET_SUCCESS); + } + } +#endif + + _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_CONNECTED); + + VOICECALL_RETURN_FALSE_IF_FAIL(callobject_info.call_id != VC_INVALID_CALL_ID); + + index = _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info); + VOICECALL_RETURN_FALSE_IF_FAIL(index != -1); + + connectednum = _vc_core_cm_get_connected_member_count_ingroup(&pcall_agent->call_manager, 0) + _vc_core_cm_get_connected_member_count_ingroup(&pcall_agent->call_manager, 1); + CALL_ENG_DEBUG(ENG_DEBUG, "Connected Member Num before adding Connected call to group is :%d", connectednum); + + /*If any previous calls are not cleared after end, clear it here so makes provision to add one more call to the call manager */ + _vc_core_cm_clear_endcall_member(&pcall_agent->call_manager); + + /*Add the conneted call to the active group */ + if (FALSE == _vc_core_cm_add_call_member_togroup(&pcall_agent->call_manager, index)) { + CALL_ENG_DEBUG(ENG_ERR, "Call Object not added to the Group, [PROBLEM] !!!"); + } + + CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager); + + /* Send Connected Event to the Client */ + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_CONNECTED, callobject_info.call_handle, 0, NULL); + + /* Once the Call is connected, change the InOut state to None */ + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_NONE); + + /*Getting AOC PPM Value is delayed to make the current flow faster by adding it to g_idle_add */ + g_idle_add(__call_vc_get_aoc_ppm_value_idle_cb, pcall_agent); + + if (_vc_core_engine_status_get_download_call(pcall_agent) == TRUE) { + g_timeout_add(9000, __call_vc_download_call_timer_cb, pcall_agent); + + _vc_core_util_download_test_call("downloadcall_success"); + } + + return TRUE; +} + +/** + * This function handles call hold event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle call handle assoicated with the call being held + * @param[in] status TAPI cause incase of hold failed + */ +gboolean _vc_core_tapi_event_handle_call_held_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status) +{ + call_vc_call_objectinfo_t callobject_info; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager); + + /* Verify call handle */ + CALL_ENG_DEBUG(ENG_DEBUG, "Started, Call Handle = %d, status = %d", call_handle, status); + + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "INVALID_CALLHANDLE Error"); + return FALSE; + } + + if (TAPI_CAUSE_SUCCESS != status) { + switch (pcall_agent->io_state) { + case VC_INOUT_STATE_OUTGOING_WAIT_HOLD: + { + /* Recover and reset related state variable */ + if (_vc_core_cm_get_outgoing_call_info(&pcall_agent->call_manager, &callobject_info) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call info does not exist"); + assert(0); + } + + if ((callobject_info.call_type == VC_CALL_ORIG_TYPE_SAT) && \ + ((pcall_agent->call_manager.setupcall_info.satcall_setup_info.satengine_setupcall_data.calltype == \ + TAPI_SAT_SETUP_CALL_PUT_ALL_OTHER_CALLS_ON_HOLD) || \ + (pcall_agent->call_manager.setupcall_info.satcall_setup_info.satengine_setupcall_data.calltype == \ + TAPI_SAT_SETUP_CALL_PUT_ALL_OTHER_CALLS_ON_HOLD_WITH_REDIAL))) { + + /*SAT Test Case(27.22.4.13.1/7), Terminal Response for Option B */ + /* _vc_core_ca_send_sat_response(pcall_agent, SAT_RQST_SETUP_CALL, CALL_VC_NETWORK_UNABLE_TO_PROCESS_COMMAND); */ + /*SAT Test Case(27.22.4.13.1/7), Terminal Response for Option A */ + _vc_core_ca_send_sat_response(pcall_agent, SAT_RQST_SETUP_CALL, CALL_VC_NETWORK_UNABLE_TO_PROCESS_COMMAND_WITHOUT_CAUSE); + + } + _vc_core_cm_clear_outgoing_call(&pcall_agent->call_manager); + + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_OUTGOING_ABORTED, VC_ENDCAUSE_CALL_ENDED, 0, NULL); + + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_NONE); + } + break; + + case VC_INOUT_STATE_INCOME_WAIT_HOLD: + break; + + case VC_INOUT_STATE_NONE: + break; + + default: + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_tapi_event_handle_call_held_event(fail): Not allowed io_state=%d", pcall_agent->io_state); + break; + } + + switch (pcall_agent->callagent_state) { +#ifdef SWAP_SUPPORT + case CALL_VC_CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE: + { + /* Reset the Agent State */ + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SWAP_FAILED, 0, NULL); + } + break; +#endif + case CALL_VC_CA_STATE_WAIT_SWAP: + { + /* Reset the Agent State */ + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SWAP_FAILED, 0, NULL); + } + break; + case CALL_VC_CA_STATE_WAIT_HOLD: + { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_HOLD_FAILED, 0, NULL); + } + break; + case CALL_VC_CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL: + { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + break; + case CALL_VC_CA_STATE_NORMAL: + default: /*Fall Through */ + CALL_ENG_DEBUG(ENG_DEBUG, "Not allowed callagent_state=%d", pcall_agent->callagent_state); + return FALSE; + break; + } + } else { + int index; + int grp_state = 0; + + /* Get the Group Index */ + index = _vc_core_cm_get_group_index(&pcall_agent->call_manager, call_handle); + grp_state = _vc_core_cm_get_group_state(&pcall_agent->call_manager, index); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, GP_Index:%d, Cur Gp State: %d", call_handle, index, grp_state); + + switch (pcall_agent->io_state) { + case VC_INOUT_STATE_OUTGOING_WAIT_HOLD: + { + /* Change the Group State */ + _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_HOLD); + CALL_ENG_DEBUG(ENG_DEBUG, "Gropu Index: %d , set to GROUP_STATE_HOLD", index); + + /* Send Call Held Event to the Client */ + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_HELD, call_handle, 0, NULL); + + if (_vc_core_tapi_rqst_setup_call(pcall_agent) == FALSE) { + _vc_core_cm_clear_outgoing_call(&pcall_agent->call_manager); + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_ABORTED); + } else { + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_WAIT_ORIG); + call_handle = _vc_core_cm_get_outgoing_call_handle(&pcall_agent->call_manager); + CALL_ENG_DEBUG(ENG_DEBUG, "Deffered Outgoing Call Handle = %d", call_handle); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_OUTGOING, call_handle, 0, NULL); + } + + if (pcall_agent->callagent_state == CALL_VC_CA_STATE_WAIT_HOLD) + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + return TRUE; + } + break; + case VC_INOUT_STATE_INCOME_WAIT_HOLD: + { + int error_code; + + /*Change the Group State*/ + _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_HOLD); + CALL_ENG_DEBUG(ENG_DEBUG, "Gropu Index: %d , set to GROUP_STATE_HOLD", index); + + if (_vc_core_tapi_rqst_answer_call(pcall_agent, VC_ANSWER_NORMAL, &error_code)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Voicecall Answered"); + /*TODO: Inform client to update ui */ + } + if (pcall_agent->callagent_state == CALL_VC_CA_STATE_WAIT_HOLD) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + } + break; + case VC_INOUT_STATE_INCOME_WAIT_HOLD_CONNECTED: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Hold arrived for Hold and Accept Event, Current IO State:%d", pcall_agent->io_state); + /*Change state to wait_connected */ + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_CONNECTED); + } + break; + case VC_INOUT_STATE_NONE: + default: /*Fall Through */ + CALL_ENG_DEBUG(ENG_DEBUG, "Not allowed io_state=%d", pcall_agent->io_state); + break; + } + + switch (pcall_agent->callagent_state) { +#ifdef SWAP_SUPPORT + case CALL_VC_CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE: + { + int held_call_num = 0; + int act_call_num = 0; + + held_call_num = _vc_core_cm_get_held_call_count(&pcall_agent->call_manager); + act_call_num = _vc_core_cm_get_active_call_count(&pcall_agent->call_manager); + if ((held_call_num > 0 && act_call_num <= 0) || (act_call_num > 0 && held_call_num <= 0)) { + if (CALL_VC_GROUP_STATE_HOLD != grp_state) { + /* Set the State to HOLD and inform client */ + _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_HOLD); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_HELD, 0, 0, NULL); + } + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } else { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_SWAP); + } + } + break; +#endif + case CALL_VC_CA_STATE_WAIT_SWAP: + { + /*Always reset the agent state as the event for this wait state is arrived */ + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + + /*Swap the state only if the group state of the given call handle is not in hold state already + as this is a hold confirmation event */ + if (CALL_VC_GROUP_STATE_HOLD != grp_state) { + _vc_core_cm_swap_group_state(&pcall_agent->call_manager); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_SWAP, call_handle, 0, NULL); + } + } + break; + case CALL_VC_CA_STATE_WAIT_HOLD: + { + /* Change the Group State */ + _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_HOLD); + CALL_ENG_DEBUG(ENG_DEBUG, "Group Index: %d , set to GROUP_STATE_HOLD", index); + + /* Change Call Agent State */ + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_HELD, call_handle, 0, NULL); + } + break; + case CALL_VC_CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL: + { + gboolean active_call = _vc_core_cm_isexists_active_call(&pcall_agent->call_manager); + gboolean held_call = _vc_core_cm_isexists_held_call(&pcall_agent->call_manager); + + /*Upon waiting for the success event for hold request, + Other calls might have been released during this time, so the held call need to retrieved */ + if ((active_call == FALSE) && (held_call == TRUE)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Unhold call"); + if (_vc_core_tapi_rqst_retrieve_call(pcall_agent) == TRUE) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_UNHOLD); + } + } + } + break; + case CALL_VC_CA_STATE_NORMAL: + default: /*Fall Through */ + CALL_ENG_DEBUG(ENG_DEBUG, "Not allowed callagent_state=%d", pcall_agent->callagent_state); + return FALSE; + break; + } + } + + return TRUE; +} + +/** +* This function handles TAPI call activate/retrieve event +* +* @return Returns TRUE on success and FALSE on failure +* @param[in] pcall_agent Pointer to the call agent state +* @param[in] call_handle call handle associated with the call being retrieved +* @param[in] status TAPI cause in case of retrieve failed +*/ +gboolean _vc_core_tapi_event_handle_call_retrieve_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, status = %d", call_handle, status); + + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "INVALID_CALLHANDLE Error"); + return FALSE; + } + + if (TAPI_CAUSE_SUCCESS != status) { + switch (pcall_agent->callagent_state) { +#ifdef SWAP_SUPPORT + case CALL_VC_CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE: + { + /*Reset the Agent State*/ + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SWAP_FAILED, 0, NULL); + } + break; +#endif + case CALL_VC_CA_STATE_WAIT_SWAP: + { + /*Reset the Call Agent State*/ + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SWAP_FAILED, 0, NULL); + } + break; + case CALL_VC_CA_STATE_WAIT_UNHOLD: + { + /*Reset the Agent State*/ + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_RETREIVE_FAILED, 0, NULL); + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Not allowed callagent_state=%d", pcall_agent->callagent_state); + return FALSE; + break; + } + + } else { + int index; + int cur_grp_state = 0; + + /*Get the Group Index and current group status */ + index = _vc_core_cm_get_group_index(&pcall_agent->call_manager, call_handle); + cur_grp_state = _vc_core_cm_get_group_state(&pcall_agent->call_manager, index); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, GP_Index:%d, Cur Gp State: %d", call_handle, index, cur_grp_state); + + switch (pcall_agent->callagent_state) { +#ifdef SWAP_SUPPORT + case CALL_VC_CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE: + { + int held_call_num = 0; + int act_call_num = 0; + + held_call_num = _vc_core_cm_get_held_call_count(&pcall_agent->call_manager); + act_call_num = _vc_core_cm_get_active_call_count(&pcall_agent->call_manager); + if ((held_call_num > 0 && act_call_num <= 0) || (act_call_num > 0 && held_call_num <= 0)) { + if (CALL_VC_GROUP_STATE_ACTIVE != cur_grp_state) { + /* Set the State ACTIVE and inform client */ + _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_ACTIVE); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_RETREIVED, 0, 0, NULL); + } + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } else { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_SWAP); + } + } + break; +#endif + case CALL_VC_CA_STATE_WAIT_SWAP: + { + /* Always reset the agent state as the event for the wait state is arrived */ + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + + /*Change the state only when the current state of the given handle is not in ACTIVE state */ + if (CALL_VC_GROUP_STATE_ACTIVE != cur_grp_state) { + _vc_core_cm_swap_group_state(&pcall_agent->call_manager); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_SWAP, call_handle, 0, NULL); + } + } + break; + case CALL_VC_CA_STATE_WAIT_UNHOLD: + { + int index; + /* get the member info and chage info */ + index = _vc_core_cm_get_group_index(&pcall_agent->call_manager, call_handle); + _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_ACTIVE); + + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + + /*Send Call Retreived Event to Client*/ + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_RETREIVED, call_handle, 0, NULL); + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Not allowed callagent_state=%d", pcall_agent->callagent_state); + /*return FALSE if the event is not handled here, because end call memeber will be unnecessarily cleared if returned TRUE */ + return FALSE; + break; + } + + } + + return TRUE; +} + +/** + * This function handles call join/conference event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle call handle assoicated with the call being joined + * @param[in] status tapi cause incase of join failed + */ +gboolean _vc_core_tapi_event_handle_call_join_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, status = %d", call_handle, status); + + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "INVALID_CALLHANDLE Error"); + return FALSE; + } + + if (TAPI_CAUSE_SUCCESS != status) { + CALL_ENG_DEBUG(ENG_DEBUG, "Join fail and return.."); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SETUP_CONF_FAILED, 0, NULL); + return TRUE; + } + + CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager); + + /* get the member info and chage info */ + _vc_core_cm_join_group(&pcall_agent->call_manager); + + CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager); + + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_SETUP_CONF, 0, 0, NULL); + return TRUE; +} + +/** + * This function handles call split/private call event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle call handle associated with the call being made as private call + * @param[in] status TAPI cause in case of split failed + */ +gboolean _vc_core_tapi_event_handle_call_split_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status) +{ + call_vc_call_objectinfo_t callobject_info; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, status = %d", call_handle, status); + + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "INVALID_CALLHANDLE Error"); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SPLIT_CONF_FAILED, 0, NULL); + return FALSE; + } + + if (TAPI_CAUSE_SUCCESS != status) { + CALL_ENG_DEBUG(ENG_DEBUG, "Split fail and return.."); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SPLIT_CONF_FAILED, 0, NULL); + return FALSE; + } + + /* get the member info and chage info */ + _vc_core_cm_clear_call_object(&callobject_info); + _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info); + + _vc_core_cm_split_group(&pcall_agent->call_manager, call_handle); + + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_SPLIT_CONF, call_handle, 0, NULL); /* Added Call handle for Aqilla */ + return TRUE; +} + +/** +* This function handles the call transfer event +* +* @return Returns TRUE on success and FALSE on failure +* @param[in] pcall_agent Pointer to the call agent state +* @param[in] status TAPI cause in case of hold failed +*/ +gboolean _vc_core_tapi_event_handle_call_transfer_event(call_vc_callagent_state_t *pcall_agent, TelCallCause_t status) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "Started, status = %d", status); + + if (TAPI_CAUSE_SUCCESS != status) { + int err_cause = 0; + CALL_ENG_DEBUG(ENG_DEBUG, "TapiTransfer Failed"); + if (VC_TAPI_INVALID_CALLHANDLE == _vc_core_cm_get_incoming_call_handle(&pcall_agent->call_manager) + && VC_TAPI_INVALID_CALLHANDLE == _vc_core_cm_get_outgoing_call_handle(&pcall_agent->call_manager)) { + err_cause = ERROR_VOICECALL_TRANSFER_FAILED; + + } else { + if (_vc_core_cm_isexists_incoming_call(&pcall_agent->call_manager)) { + err_cause = ERROR_VOICECALL_TRANSFER_FAILED; + } else if (VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED == pcall_agent->io_state) { + err_cause = ERROR_VOICECALL_TRANSFER_FAILED; + } + } + + _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, err_cause, 0, NULL); + CALL_ENG_DEBUG(ENG_DEBUG, "Transfer failed and return.."); + + return TRUE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Transfer success!"); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_TRANSFERRED, 0, 0, NULL); + } + /*todo ss : Check Updating flag gbpsh_voicecall_command_transfer*/ + return TRUE; +} + +/** +* This function handles the TAPI connected line indication handle +* +* @return Returns TRUE on success and FALSE on failure +* @param[in] pcall_agent Pointer to the call agent state +* @param[in] call_handle TAPI Call Handle associated with connected line indication +* @param[in] connected_number_info Connected Number Details +*/ +gboolean _vc_core_tapi_event_connected_line_ind_handle(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallConnectedNumberInfo_t *connected_number_info) +{ + call_vc_call_objectinfo_t callobject_info; + call_vc_handle active_call_handle = VC_TAPI_INVALID_CALLHANDLE; + gboolean bConnectedCall = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, ":Number(%s)", connected_number_info->number); + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_ERR, " INVALID_CALLHANDLE Error"); + return FALSE; + } + + _vc_core_cm_clear_call_object(&callobject_info); + + if (_vc_core_cm_get_outgoing_call_info(&pcall_agent->call_manager, &callobject_info)) { + if (callobject_info.call_handle != call_handle) { + CALL_ENG_DEBUG(ENG_ERR, "It is not outging call(Call Handle = %d, MO Call Handle =%d)", call_handle, callobject_info.call_handle); + return FALSE; + } + } else { + if (_vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &active_call_handle) == -1) { + CALL_ENG_DEBUG(ENG_ERR, "No Active Calls(Call Handle = %d)", call_handle); + return FALSE; + } + + if (active_call_handle != call_handle) { + CALL_ENG_DEBUG(ENG_ERR, "Call Handle Mismatch(Call Handle = %d)", call_handle); + return FALSE; + } + + _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info); + bConnectedCall = TRUE; + } + + switch (connected_number_info->name_mode) { + case TAPI_CALL_NAME_AVAIL: /*if sznumber of the callInfo is null, set Anoymous*/ + + if (0 == strlen(connected_number_info->number)) { + /*Forwarded Call number is unknown*/ + memset(callobject_info.connected_telnumber, 0, sizeof(callobject_info.connected_telnumber)); + } else { + _vc_core_util_strcpy(callobject_info.connected_telnumber, sizeof(callobject_info.connected_telnumber), connected_number_info->number); + } + + break; + + case TAPI_CALL_NAME_RESTRICTED: + case TAPI_CALL_NAME_AVAIL_RESTRICTED: /*withheld*/ + /*Forwarded Call number is unknown*/ + memset(callobject_info.connected_telnumber, 0, sizeof(callobject_info.connected_telnumber)); + break; + + case TAPI_CALL_NAME_UNAVAIL: /*Anoymous*/ + default: + /*Forwarded Call number is unknown*/ + memset(callobject_info.connected_telnumber, 0, sizeof(callobject_info.connected_telnumber)); + break; + } + + /*Set the modified call object to call manager*/ + _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info); + + /*Send Event to the Client*/ + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_CONNECT_LINE_IND, callobject_info.call_handle, 0, (void *)callobject_info.connected_telnumber); + + return TRUE; +} + +/** + * This function handles different type of TAPI indications given in tapi_event_type + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] tapi_event_type TAPI Event Type + * @param[in] param2 sub param associated with tapi_event_type + */ +gboolean _vc_core_tapi_event_handle_notification(call_vc_callagent_state_t *pcall_agent, int tapi_event_type, int param2) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "eventType = %d", tapi_event_type); + + /* set the notify message string as the event type */ + switch (tapi_event_type) { + case TAPI_EVENT_CALL_FORWARD_IND: + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_FORWARD, VC_FRWD_IND_INCOM_IS_FRWD, 0, NULL); + break; + + case TAPI_EVENT_CALL_COND_FORWARDING_IND: + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_COND_FORWARDING_IND"); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_SSNOTIFY, VC_SSNOTIFY_IND_ALL_COND_FORWARDING, 0, NULL); + break; + + case TAPI_EVENT_CALL_UNCOND_FORWARDING_IND: + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_UNCOND_FORWARDING_IND"); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_SSNOTIFY, VC_SSNOTIFY_IND_CFU, 0, NULL); + break; + + case TAPI_EVENT_CALL_RETRIEVE_IND: + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_ACTIVATE_IND"); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_ACTIVATE, 0, 0, NULL); + break; + + case TAPI_EVENT_CALL_HOLD_IND: + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_HOLD_IND"); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_HOLD, 0, 0, NULL); + break; + + case TAPI_EVENT_CALL_TRANSFER_IND: + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_TRANSFER_IND"); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_TRANSFER, 0, 0, NULL); + break; + + case TAPI_EVENT_CALL_SETUPCONFERENCE_IND: + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_SETUPCONFERENCE_IND"); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_SETUPCONFERENCE, 0, 0, NULL); + break; + + case TAPI_EVENT_CALL_BARRING_IND: + { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_BARRING_IND, cause = %d", param2); + + barring_ind_type = VC_BARR_IND_ALL; + } + break; + + case TAPI_EVENT_CALL_WAITING_IND: + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_WAITING_IND"); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_WAITING, 0, 0, NULL); + break; + + case TAPI_EVENT_CALL_CUGINFO_IND: + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_CUGINFO_IND"); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_CUGINFO, 0, 0, NULL); + break; +#ifdef _OLD_TAPI_ + case TAPI_EVENT_CALL_SSNOTIFY_IND: + { + voicecall_ssnotify_ind_type_t ssnotify_ind_type; + CALL_ENG_DEBUG(ENG_DEBUG, " TAPI_EVENT_CALL_SSNOTIFY_IND"); + switch (param2) { + case TAPI_SSCODE_CFU: + ssnotify_ind_type = VC_SSNOTIFY_IND_CFU; + break; + + case TAPI_SSCODE_CFB: + ssnotify_ind_type = VC_SSNOTIFY_IND_CFB; + break; + + case TAPI_SSCODE_CFNRY: + ssnotify_ind_type = VC_SSNOTIFY_IND_CFNRY; + break; + + case TAPI_SSCODE_CFNRC: + ssnotify_ind_type = VC_SSNOTIFY_IND_CFNRC; + break; + + case TAPI_SSCODE_CLIR: + ssnotify_ind_type = VC_SSNOTIFY_IND_CLIR; + break; + + case TAPI_SSCODE_ALL_COND_FORWARDING: + ssnotify_ind_type = VC_SSNOTIFY_IND_ALL_COND_FORWARDING; + break; + + case TAPI_SSCODE_BARRING_OF_OUTGOING: + ssnotify_ind_type = VC_SSNOTIFY_IND_BARRING_OF_OUTGOING; + break; + + default: + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_SSNOTIFY_IND ], No Action defined for sub type:%d", param2); + return TRUE; + + break; + } + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_SSNOTIFY, ssnotify_ind_type, 0, NULL); + } + break; + + case TAPI_EVENT_CALL_REDIRECT_CNF: + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_REDIRECT_CNF"); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_REDIRECT_CNF, 0, 0, NULL); + break; +#endif + case TAPI_EVENT_CALL_CALLINGNAMEINFO_IND: + CALL_ENG_DEBUG(ENG_DEBUG, " TAPI_EVENT_CALL_CALLINGNAMEINFO_IND"); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_CALLINGNAMEINFO, 0, 0, NULL); + break; + + default: + CALL_ENG_DEBUG(ENG_DEBUG, "default eventType = %d", tapi_event_type); + return TRUE; + } + return TRUE; +} + +/** + * This function handles the AOC Event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle Call Handle + * @param[in] ptapi_aoc_info AOC info associated with the AOC Event + */ +gboolean _vc_core_tapi_event_handle_aoc(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallAocInfo_t *ptapi_aoc_info) +{ + call_vc_call_objectinfo_t callobject_info; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "Started, Call Handle = %d", call_handle); + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_ERR, "INVALID_CALLHANDLE Error"); + return FALSE; + } + + /* get the member info and chage info */ + _vc_core_cm_clear_call_object(&callobject_info); + if (FALSE == _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info)) { + CALL_ENG_DEBUG(ENG_ERR, "Call Object Not available"); + return FALSE; + } + + /* Store the call cost TAPI info */ + callobject_info.aoc_ccm = ptapi_aoc_info->CCM; + memcpy((void *)callobject_info.aoc_currency, (const void *)ptapi_aoc_info->szCurrency, VC_AOC_CURRENCY_CODE_LEN_MAX); + + /* Set the modified call object to the Call Mangaer */ + _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info); + + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_AOC, call_handle, 0, &callobject_info); + return TRUE; + +} + +static gboolean __call_vc_get_aoc_ppm_value_idle_cb(gpointer pdata) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pdata; + __call_vc_get_aoc_ppm_value(pcall_agent); + return FALSE; +} + +static gboolean __call_vc_download_call_timer_cb(gpointer pdata) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pdata; + _vc_core_ca_end_all_calls(pcall_agent); + return FALSE; +} + +static void __call_vc_get_aoc_ppm_value(call_vc_callagent_state_t *pcall_agent) +{ + TapiResult_t tapi_error = TAPI_API_SUCCESS; + int ReqId = VC_RQSTID_DEFAULT; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + if (pcall_agent->aoc_ppm == VC_INVALID_PPM) { + tapi_error = tel_get_ss_aoc_info(TAPI_SS_AOC_TYPE_PUC, &ReqId); + + if (tapi_error != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_ERR, "TAPI Error: %x", tapi_error); + } + } +} diff --git a/call-engine/core/vc-core-tapi-rqst.c b/call-engine/core/vc-core-tapi-rqst.c new file mode 100755 index 0000000..a5262fb --- /dev/null +++ b/call-engine/core/vc-core-tapi-rqst.c @@ -0,0 +1,1169 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include "vc-core-tapi-rqst.h" +#include "vc-core-util.h" +#include "vc-core-engine-types.h" + +static int gcall_vc_callmember_count = 0; +static gboolean gcall_vc_callend_wait = FALSE; + +#ifdef _CALL_LONG_DTMF +static char gsz_dtmf_buffer[TAPI_CALL_DIALDIGIT_LEN_MAX + 1]; +static int gdtmf_headindex = 0; +static int gdtmf_tailindex = 0; +static call_vc_dtmf_bufferstate_t gdtmf_buffer_state = CALL_VC_DTMF_BUF_NONE; +static gboolean glong_dtmf_mode = FALSE; +#endif + +/*Local Function Declerations */ +/** +* This function splits the given call from the conference call , if available +* +* @internal +* @return Returns TRUE on success or FALSE on failure +* @param[in] call_handle handle of the call to be splitted +*/ +static gboolean __call_vc_split_member(call_vc_handle call_handle); + + /** + * This function prepares for a call setup + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_prepare_setup_call(call_vc_callagent_state_t *pcall_agent) +{ + call_vc_call_objectinfo_t callobject_info = { 0 }; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "IO State =%d, Agent State: %d", pcall_agent->io_state, pcall_agent->callagent_state); + + _vc_core_cm_clear_call_object(&callobject_info); + if ((_vc_core_cm_get_outgoing_call_info(&pcall_agent->call_manager, &callobject_info) == FALSE) || (strlen(callobject_info.tel_number) == 0) || (pcall_agent->callagent_state != CALL_VC_CA_STATE_NORMAL)) { + CALL_ENG_DEBUG(ENG_DEBUG, "MO Call Not Possible: Number: %s", callobject_info.tel_number); + return FALSE; + } else if (_vc_core_cm_isexists_active_call(&pcall_agent->call_manager) && _vc_core_cm_isexists_held_call(&pcall_agent->call_manager)) { + /*Emergency calls should be established, even when active or hold calls exists */ + if (TRUE == callobject_info.bemergency_number) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SETUP); + _vc_core_tapi_rqst_release_all_calls(pcall_agent); + return TRUE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Active&Held call exist!"); + return FALSE; + } + } else if (_vc_core_cm_isexists_active_call(&pcall_agent->call_manager)) { + CALL_ENG_DEBUG(ENG_DEBUG, "There is active call when trying new call..."); + + /* Change the In Out State accordingly after Hold Call */ + if (_vc_core_tapi_rqst_hold_call(pcall_agent) == FALSE) { + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_NONE); + return FALSE; + } else { + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_WAIT_HOLD); + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_HOLD); + return TRUE; + } + } else { + if (_vc_core_tapi_rqst_setup_call(pcall_agent) == FALSE) { + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_NONE); + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_tapi_rqst_prepare_setup_call:Fail to _vc_core_tapi_rqst_setup_call"); + return FALSE; + } else { + /* Wait for the TAPI_EVENT_CALL_ORIG */ + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_WAIT_ORIG); + return TRUE; + } + } + + return FALSE; +} + + /** + * This function sets up an outgoing call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_setup_call(call_vc_callagent_state_t *pcall_agent) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + TelCallSetupParams_t setupCallInfo; +/* TelCallCugInfo_t pCugInfo = {0,};*/ + call_vc_call_objectinfo_t callobject_info = { 0 }; +/* TelCallIdentityMode_t identityMode = TAPI_CALL_IDENTITY_DEFAULT;*/ + TapiResult_t tapi_err = TAPI_API_SUCCESS; + int ReqId = VC_RQSTID_DEFAULT; + clock_t start; + clock_t end; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + memset(&setupCallInfo, 0, sizeof(TelCallSetupParams_t)); + + /* Get the Outgoing Call Info */ + _vc_core_cm_clear_call_object(&callobject_info); + if (_vc_core_cm_get_outgoing_call_info(&pcall_agent->call_manager, &callobject_info) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call info does not exist!"); + return FALSE; + } + /* set setupCallInfo structure for call setup */ + if (callobject_info.bemergency_number == TRUE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Emergency call!"); + setupCallInfo.CallType = TAPI_CALL_TYPE_E911; + /*setupCallInfo.Ecc = callobject_info.ecc_category; + CALL_ENG_DEBUG(ENG_DEBUG,"Emergency call, ecc_category:[%d]!", callobject_info.ecc_category);*/ + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Normal call!"); + setupCallInfo.CallType = TAPI_CALL_TYPE_VOICE; + } + + /*Set the Call Object MO Flag as TRUE */ + callobject_info.mo = TRUE; + + /* cli setting */ + if (_vc_core_util_extract_call_number_without_cli(callobject_info.source_tel_number, setupCallInfo.szNumber, sizeof(setupCallInfo.szNumber)) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "No proper number = %s", callobject_info.source_tel_number); + return FALSE; + } + CALL_ENG_DEBUG(ENG_DEBUG, "tapi callnum=[%s]", setupCallInfo.szNumber); + + + /* CUG settings */ +#ifdef _TAPI_CUG_ + setupCallInfo.pCugInfo = &pCugInfo; + if (FALSE == callobject_info.cug_info.bcug_used) { + setupCallInfo.pCugInfo->bCugFlag = FALSE; + } else { + setupCallInfo.pCugInfo->bCugFlag = TRUE; + /*if the index is 0, use pref cug, so no cug index */ + if (0 == callobject_info.cug_info.cug_index) { + setupCallInfo.pCugInfo->Option = TAPI_CALL_CUG_NO_INFO; + setupCallInfo.pCugInfo->Index = 0; + } else { + if ((FALSE == callobject_info.cug_info.bpref_cug) && (FALSE == callobject_info.cug_info.boa_cug)) { + setupCallInfo.pCugInfo->Option = TAPI_CALL_CUG_SUPRESS_OA_AND_CUG; + } else if (FALSE == callobject_info.cug_info.bpref_cug) { + setupCallInfo.pCugInfo->Option = TAPI_CALL_CUG_SUPRESS_PRF_CUG; + } else if (FALSE == callobject_info.cug_info.boa_cug) { + setupCallInfo.pCugInfo->Option = TAPI_CALL_CUG_SUPRESS_OA; + } else { + setupCallInfo.pCugInfo->Option = TAPI_CALL_CUG_NO_INFO; + } + setupCallInfo.pCugInfo->Index = callobject_info.cug_info.cug_index; + } + } +#endif + +#ifdef _CPHS_DEFINED_ + if (TRUE == _vc_core_svcall_cphs_csp_get_status(pcall_agent, VC_CPHS_CSP_ALS)) { + if (callobject_info.setupBy == VC_CALL_SETUP_BY_MAILBOX) { + if (callobject_info.alsLine == VC_CALL_CPHS_ALS_LINE1) { + tel_set_call_act_line(TAPI_CALL_ACTIVE_LINE1, &ReqId); + } else if (callobject_info.alsLine == VC_CALL_CPHS_ALS_LINE2) { + tel_set_call_act_line(TAPI_CALL_ACTIVE_LINE2, &ReqId); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "callobject_info.alsLine invalid value=%d", callobject_info.alsLine); + tel_set_call_act_line(TAPI_CALL_ACTIVE_LINE1, &ReqId); + } + } else { + /*read the line information from the dynamic flags */ + voice_call_cphs_alsline_t als_line; + callobject_info.alsLine = _vc_core_svcall_get_cphs_als_active_line(pcall_agent); + tel_set_call_act_line(callobject_info.alsLine); + _vc_core_cm_set_outgoing_call_info(&pcall_agent->call_manager, &callobject_info); + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "ACtive Line Set is TAPI_ACTIVE_LINE1"); + tel_set_call_act_line(TAPI_CALL_ACTIVE_LINE1, &ReqId); + } +#endif + + CALL_ENG_DEBUG(ENG_DEBUG, "call_type = %d", setupCallInfo.CallType); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Type by Source: %d", callobject_info.call_type); + if (VC_CALL_ORIG_TYPE_SAT == callobject_info.call_type) { + /*setupCallInfo.bRequestedBySAT = TRUE;*/ + } else { + /*setupCallInfo.bRequestedBySAT = FALSE;*/ + } + /*CALL_ENG_DEBUG(ENG_DEBUG,"Call Initiated by SAT: %d",setupCallInfo.bRequestedBySAT);*/ + + CALL_ENG_KPI("tel_exe_call_mo start"); + /*This Function originates MO Call set-up, This is asynchronous function */ + tapi_err = tel_exe_call_mo(&setupCallInfo, (TS_UINT *) &call_handle, &ReqId); + CALL_ENG_KPI("tel_exe_call_mo done"); + + CALL_ENG_DEBUG(ENG_DEBUG, "ReqId is = %d", ReqId); + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tapi_call_setup failed: Error Code: %d", tapi_err); + return FALSE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle = %d", call_handle); + + /* Set the Call Handle to the CallbObject for future reference */ + callobject_info.call_handle = call_handle; + + _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_OUTGOING); + callobject_info.call_id = _vc_core_cm_get_new_callId(&pcall_agent->call_manager); + + _vc_core_cm_set_outgoing_call_info(&pcall_agent->call_manager, &callobject_info); + + CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager); + } + return TRUE; +} + + /** + * This function answers the call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] answer_type call answer type #voicecall_answer_type_t + * @param[out] error_code Error code + */ +gboolean _vc_core_tapi_rqst_answer_call(call_vc_callagent_state_t *pcall_agent, voicecall_answer_type_t answer_type, int *error_code) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + /*Encapsulates Errors and Warnings from TAPI Library */ + TapiResult_t tapi_err = TAPI_API_SUCCESS; + int ReqId = VC_RQSTID_DEFAULT; + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(error_code != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + if ((VC_INOUT_STATE_INCOME_WAIT_CONNECTED == pcall_agent->io_state) + || (VC_INOUT_STATE_INCOME_WAIT_HOLD_CONNECTED == pcall_agent->io_state) + || (VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVE_CONNECTED == pcall_agent->io_state)) + /*||(VC_INOUT_STATE_INCOME_WAIT_RELEASE_HOLDCALL == pcall_agent->io_state))*/ + { + CALL_ENG_DEBUG(ENG_DEBUG, "Answer Call Request Already Made"); + *error_code = ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS; + return FALSE; + } + + /* + Process the answer call request only when the state is in income and it is not ended. + This must be checked as both incoming event and incoming end event from tapi are added to g_idle_add + so any change in state should be noted before accepting the call + */ + if ((VC_INOUT_STATE_INCOME_BOX != pcall_agent->io_state) || (VC_INOUT_STATE_INCOME_END == pcall_agent->io_state)) { + CALL_ENG_DEBUG(ENG_DEBUG, "IO State not in VC_INOUT_STATE_INCOME_BOX, Current state: %d", pcall_agent->io_state); + *error_code = ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS; + return FALSE; + } + + _vc_core_cm_clear_endcall_member(&pcall_agent->call_manager); + call_handle = _vc_core_cm_get_incoming_call_handle(&pcall_agent->call_manager); + + CALL_ENG_DEBUG(ENG_DEBUG, "answer_type = %d,Incoming call Handle: %d", answer_type, call_handle); + if (VC_TAPI_INVALID_CALLHANDLE == call_handle) { + *error_code = ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + return FALSE; + } + + switch (answer_type) { + case VC_ANSWER_NORMAL: + { + /*Answer a call by accepting or rejecting a call */ + tapi_err = tel_answer_call(call_handle, TAPI_CALL_ANSWER_ACCEPT, &ReqId); + if (TAPI_API_SUCCESS == tapi_err) { + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_CONNECTED); + } + } + break; + case VC_ANSWER_HOLD_ACTIVE_AND_ACCEPT: + { + /*Answer a call by accepting or rejecting a call */ + tapi_err = tel_answer_call(call_handle, TAPI_CALL_ANSWER_HOLD_AND_ACCEPT, &ReqId); + if (TAPI_API_SUCCESS == tapi_err) { + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_HOLD_CONNECTED); + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_HOLD); + } + } + break; + case VC_ANSWER_RELEASE_ACTIVE_AND_ACCEPT: + { + /*Answer a call by accepting or rejecting a call */ + tapi_err = tel_answer_call(call_handle, TAPI_CALL_ANSWER_REPLACE, &ReqId); + if (TAPI_API_SUCCESS == tapi_err) { + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVE_CONNECTED); + } + } + break; + case VC_ANSWER_RELEASE_HOLD_AND_ACCEPT: + { + /* first end held call and then accept incoming */ + if (TRUE == _vc_core_tapi_rqst_release_held_calls(pcall_agent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_tapi_rqst_release_held_calls returns TRUE"); + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_RELEASE_HOLDCALL); + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_RELEASE_ALL_HOLDCALL); + } + return TRUE; + } + break; +#ifdef RELEASE_ALL_AND_ACCEPT_SUPPORT + case VC_ANSWER_RELEASE_ALL_AND_ACCEPT: + { + /* first (end held call) and then ( release accept and accept ) */ + if (TRUE == _vc_core_tapi_rqst_release_held_calls(pcall_agent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_tapi_rqst_release_held_calls returns TRUE"); + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_RELEASE_HOLDCALL_FOR_ALL_RELEASE); + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_RELEASE_ALL_HOLDCALL); + } + return TRUE; + } + break; +#endif + default: + { + *error_code = ERROR_VOICECALL_NOT_SUPPORTED; + return FALSE; + } + } + + if (TAPI_API_SUCCESS != tapi_err) { + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_NONE); + CALL_ENG_DEBUG(ENG_DEBUG, "tel_answer_call failed ,Error Code:%d", tapi_err); + *error_code = ERROR_VOICECALL_ANSWER_FAILED; + CALL_ENG_DEBUG(ENG_DEBUG, "tel_answer_call failed ,Engine Error Code:%d", *error_code); + return FALSE; + } + + return TRUE; +} + +/** + * This function checks and prepares to accept a call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_response_call(call_vc_callagent_state_t *pcall_agent) +{ + gboolean active_call, held_call, incoming_call; + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + active_call = _vc_core_cm_isexists_active_call(&pcall_agent->call_manager); + held_call = _vc_core_cm_isexists_held_call(&pcall_agent->call_manager); + incoming_call = _vc_core_cm_isexists_incoming_call(&pcall_agent->call_manager); + + if (active_call && held_call) { + CALL_ENG_DEBUG(ENG_DEBUG, "Show EndCallChoice Box"); + return TRUE; + } else if (active_call) { + CALL_ENG_DEBUG(ENG_DEBUG, "Case of bActiceCall..."); + /* if there are active call, after hold call can accept mtc */ + /* set the flag and return */ + /*Although TapiHold failed, keep on going( because , when active call is ended, TapiHold failed then ansercall is possible... only when Tapihold succeed, state is changed to WAIT_HOLD*/ + if (_vc_core_tapi_rqst_hold_call(pcall_agent) == TRUE) { + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_HOLD); + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_HOLD); + return TRUE; + } + } else if (incoming_call == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Call Available"); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Calling tapi_call_respond_recall(call_handle = %d, TRUE) ...", call_handle); + + return TRUE; +} + +/** + * This function releases active calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_release_active_calls(call_vc_callagent_state_t *pcall_agent) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + int pReqId = VC_RQSTID_DEFAULT; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + int nPos; + int nCount = 0; + call_vc_call_objectinfo_t callobject_info = { 0 }; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + CALL_ENG_DEBUG(ENG_DEBUG, ".."); +#ifdef NEW_TAPI_API + nPos = _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &call_handle); + + if (call_handle != -1) { + CALL_ENG_DEBUG(ENG_DEBUG, "First Active call_handle = %d", call_handle); +#ifdef SINGLE_CALL_END + if (_vc_core_cm_get_call_member_count(&pcall_agent->call_manager) == 1) { + CALL_ENG_DEBUG(ENG_DEBUG, "End Single call.."); + + /* Use ReleaseAll api in case single call is ended - this is caused by modem limitation */ + tapi_err = tel_release_call_all(&pReqId); + } else +#endif + { + tapi_err = tel_release_call_all_active(&pReqId); + } + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "Release All Active Failed call_handle=%d Error Code:%d...", call_handle, tapi_err); + return FALSE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "pReqId = %d", pReqId); + while (nPos != -1) { + _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info); + _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_RELEASE_WAIT); + _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info); + + nPos = _vc_core_cm_get_next_active_call_handle(&pcall_agent->call_manager, &call_handle, nPos); + } + + return TRUE; + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "No Active calls available"); + return FALSE; + } +#else + gcall_vc_callmember_count = 0; + + nPos = _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &call_handle); + + _vc_core_cm_clear_call_object(&callobject_info); + while (nPos != -1) { + _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info); + + if (callobject_info.state == VC_CALL_STATE_CONNECTED) { +#ifdef SINGLE_CALL_END + if (_vc_core_cm_get_call_member_count(&pcall_agent->call_manager) == 1) { + CALL_ENG_DEBUG(ENG_DEBUG, "End Single call.."); + + /* Use ReleaseAll api in case single call is ended - this is caused by modem limitation */ + tapi_err = tel_release_call_all(&pReqId); + } else +#endif + { + /*Releases the call identified by Call Handle irrespective of call is hold or active state */ + tapi_err = tel_release_call(call_handle, &pReqId); + } + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tapi_call_relese Failed call_handle=%d Error Code:%d...", call_handle, tapi_err); + return FALSE; + } else { + _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_RELEASE_WAIT); + _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info); + nCount++; + } + } + nPos = _vc_core_cm_get_next_active_call_handle(&pcall_agent->call_manager, &call_handle, nPos); + } + + gcall_vc_callmember_count = nCount; + if (gcall_vc_callmember_count > 0) { + gcall_vc_callend_wait = TRUE; + return TRUE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "There is no active call to release.."); + return FALSE; + } +#endif +} + +/** + * This function releases held calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_release_held_calls(call_vc_callagent_state_t *pcall_agent) +{ + int nPos; + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + call_vc_call_objectinfo_t callobject_info = { 0 }; + int nCount = 0; + int pReqId = VC_RQSTID_DEFAULT; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + CALL_ENG_DEBUG(ENG_DEBUG, ".."); +#ifdef NEW_TAPI_API + nPos = _vc_core_cm_get_first_held_call_handle(&pcall_agent->call_manager, &call_handle); + + if (call_handle != -1) { + CALL_ENG_DEBUG(ENG_DEBUG, "First Held call_handle = %d", call_handle); +#ifdef SINGLE_CALL_END + if (_vc_core_cm_get_call_member_count(&pcall_agent->call_manager) == 1) { + CALL_ENG_DEBUG(ENG_DEBUG, "End Single call.."); + + /* Use ReleaseAll api in case single call is ended - this is caused by modem limitation */ + tapi_err = tel_release_call_all(&pReqId); + } else +#endif + { + tapi_err = tel_release_call_all_held(&pReqId); + } + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "Release All Held Failed call_handle=%d Error Code:%d...", call_handle, tapi_err); + return FALSE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "pReqId = %d", pReqId); + while (nPos != -1) { + _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info); + _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_RELEASE_WAIT); + _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info); + + nPos = _vc_core_cm_get_next_held_call_handle(&pcall_agent->call_manager, &call_handle, nPos); + } + + return TRUE; + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "No Held calls available"); + return FALSE; + } +#else + gcall_vc_callmember_count = 0; + + nPos = _vc_core_cm_get_first_held_call_handle(&pcall_agent->call_manager, &call_handle); + + _vc_core_cm_clear_call_object(&callobject_info); + while (nPos != -1) { + _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info); + + if (callobject_info.state == VC_CALL_STATE_CONNECTED) { +#ifdef SINGLE_CALL_END + if (_vc_core_cm_get_call_member_count(&pcall_agent->call_manager) == 1) { + CALL_ENG_DEBUG(ENG_DEBUG, "End Single call.."); + + /* Use ReleaseAll api in case single call is ended - this is caused by modem limitation */ + tapi_err = tel_release_call_all(&pReqId); + } else +#endif + { + /*Releases the call identified by Call Handle irrespective of call is hold or active state */ + tapi_err = tel_release_call(call_handle, &pReqId); + } + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tapi_call_relese Failed call_handle=%d Error Code:%d...", call_handle, tapi_err); + return FALSE; + } else { + _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_RELEASE_WAIT); + _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info); + nCount++; + } + } + nPos = _vc_core_cm_get_next_held_call_handle(&pcall_agent->call_manager, &call_handle, nPos); + } + + gcall_vc_callmember_count = nCount; + if (gcall_vc_callmember_count > 0) { + gcall_vc_callend_wait = TRUE; + return TRUE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "There is no held call to release.."); + return FALSE; + } +#endif +} + +/** + * This function releases all calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_release_all_calls(call_vc_callagent_state_t *pcall_agent) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + int pReqId = VC_RQSTID_DEFAULT; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &call_handle); + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle:[%d]..", call_handle); + + if (VC_TAPI_INVALID_CALLHANDLE == call_handle) { + _vc_core_cm_get_first_held_call_handle(&pcall_agent->call_manager, &call_handle); + } + + if (VC_TAPI_INVALID_CALLHANDLE == call_handle) { + CALL_ENG_DEBUG(ENG_DEBUG, "invalid call handle"); + return FALSE; + } + + /*Releases All calls irrespective of call is in hold or active state */ + tapi_err = tel_release_call_all(&pReqId); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_release_call_all failed: Error _Code: %d", tapi_err); + return FALSE; + } + + return TRUE; +} + +/** + * This function releases the incoming call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_release_incoming_call(call_vc_callagent_state_t *pcall_agent) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + int pReqId = VC_RQSTID_DEFAULT; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + call_handle = _vc_core_cm_get_incoming_call_handle(&pcall_agent->call_manager); + if (VC_TAPI_INVALID_CALLHANDLE == call_handle) + return FALSE; + +#ifdef SINGLE_CALL_END + if (_vc_core_cm_get_call_member_count(&pcall_agent->call_manager) == 1) { + CALL_ENG_DEBUG(ENG_DEBUG, "End Single call.."); + + /* Use ReleaseAll api in case single call is ended - this is caused by modem limitation */ + tapi_err = tel_release_call_all(&pReqId); + } else +#endif + { + /*Releases the call identified by Call Handle irrespective of call is hold or active state */ + tapi_err = tel_release_call(call_handle, &pReqId); + } + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_release_call() call_handle=%d Failed, Error Code: %d...", call_handle, tapi_err); + return FALSE; + } + + _vc_core_cm_change_call_object_state(&pcall_agent->call_manager, call_handle, VC_CALL_STATE_REJECTED); + + return TRUE; + +} + +/** + * This function releases outgoing call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_release_outgoing_call(call_vc_callagent_state_t *pcall_agent) +{ + + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + int pReqId = VC_RQSTID_DEFAULT; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + call_handle = _vc_core_cm_get_outgoing_call_handle(&pcall_agent->call_manager); + + if (VC_TAPI_INVALID_CALLHANDLE == call_handle) + return FALSE; + +#ifdef SINGLE_CALL_END + if (_vc_core_cm_get_call_member_count(&pcall_agent->call_manager) == 1) { + CALL_ENG_DEBUG(ENG_DEBUG, "End Single call.."); + + /* Use ReleaseAll api in case single call is ended - this is caused by modem limitation */ + tapi_err = tel_release_call_all(&pReqId); + } else +#endif + { + /*Releases the call identified by Call Handle irrespective of call is hold or active state */ + tapi_err = tel_release_call(call_handle, &pReqId); + } + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_release_call Failed call_handle=%d Error Code:%d", call_handle, tapi_err); + return FALSE; + } + + _vc_core_cm_change_call_object_state(&pcall_agent->call_manager, call_handle, VC_CALL_STATE_CANCELLED); + + return TRUE; +} + +/** + * This function holds a call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_hold_call(call_vc_callagent_state_t *pcall_agent) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + int ReqId = VC_RQSTID_DEFAULT; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + /*Get the current active call handle and hold it*/ + _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &call_handle); + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "ERROR: No active call available"); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "calling tapi_call_hold, Current active call = %d...", call_handle); + + /* Hold the call */ + /*Puts the given call on hold */ + tapi_err = tel_hold_call(call_handle, &ReqId); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_hold_call() Failed Error Code: %d", tapi_err); + return FALSE; + } + + return TRUE; +} + +/** + * This function retrieves a call from hold + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_retrieve_call(call_vc_callagent_state_t *pcall_agent) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + int ReqId = VC_RQSTID_DEFAULT; + + CALL_ENG_DEBUG(ENG_DEBUG, "..."); + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + _vc_core_cm_get_first_held_call_handle(&pcall_agent->call_manager, &call_handle); + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Hold Call Error..."); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Cur held call_handle = %d.", call_handle); + /* activate the call */ + /*This function retrieves the held call */ + tapi_err = tel_retrieve_call(call_handle, &ReqId); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_retrieve_call() Failed, Error Code: %d", tapi_err); + return FALSE; + } + + return TRUE; +} + +/** + * This function swaps held and active calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_swap_calls(call_vc_callagent_state_t *pcall_agent) +{ + call_vc_handle active_call = VC_TAPI_INVALID_CALLHANDLE, held_call = VC_TAPI_INVALID_CALLHANDLE; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + int ReqId = VC_RQSTID_DEFAULT; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &active_call); + if (active_call == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Active Call..."); + return FALSE; + } + + _vc_core_cm_get_first_held_call_handle(&pcall_agent->call_manager, &held_call); + if (held_call == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_tapi_rqst_swap_calls: No Hold Call..."); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Current Active call = %d, Hold call :%d", active_call, held_call); + + tapi_err = tel_swap_call(active_call, held_call, &ReqId); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_swap_call() Failed, Error Code: %d", tapi_err); + return FALSE; + } + + return TRUE; +} + +/** + * This function joins two calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_join_calls(call_vc_callagent_state_t *pcall_agent) +{ + call_vc_handle active_call = VC_TAPI_INVALID_CALLHANDLE, held_call = VC_TAPI_INVALID_CALLHANDLE; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + int ReqId = VC_RQSTID_DEFAULT; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &active_call); + if (active_call == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Active Call"); + return FALSE; + } + + _vc_core_cm_get_first_held_call_handle(&pcall_agent->call_manager, &held_call); + if (held_call == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Hold Call"); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Current Active call = %d, Hold call :%d", active_call, held_call); + /*This functions joins given two calls */ + tapi_err = tel_join_call(active_call, held_call, &ReqId); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_join_call() Failed, Error Code: %d", tapi_err); + return FALSE; + } + + return TRUE; +} + +/** + * This function splits the members of a call given its call handle + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + * @param[in] call_handle Call handle for a call the members of which has to be split + */ +gboolean _vc_core_tapi_rqst_private_call(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle) +{ + + if (TRUE == __call_vc_split_member(call_handle)) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_SPLIT); + return TRUE; + } else { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + return FALSE; + } +} + +static gboolean __call_vc_split_member(call_vc_handle call_handle) +{ + TapiResult_t tapi_err = TAPI_API_SUCCESS; + int ReqId = VC_RQSTID_DEFAULT; + + CALL_ENG_DEBUG(ENG_DEBUG, "..."); + VOICECALL_RETURN_FALSE_IF_FAIL(call_handle != VC_TAPI_INVALID_CALLHANDLE); + + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle to be splited : %d", call_handle); + + /*Splits a private call from multiparty call. */ + tapi_err = tel_split_call(call_handle, &ReqId); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_split_call() Failed, Error Code: %d", tapi_err); + return FALSE; + } + + return TRUE; +} + +/** + * This function transfers call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_transfer_call(call_vc_callagent_state_t *pcall_agent) +{ + call_vc_handle active_call = VC_TAPI_INVALID_CALLHANDLE; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + int ReqId = VC_RQSTID_DEFAULT; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &active_call); + if (active_call == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Active Call..."); + + active_call = _vc_core_cm_get_outgoing_call_handle(&pcall_agent->call_manager); + if (VC_TAPI_INVALID_CALLHANDLE == active_call) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Outgoing Call..."); + return FALSE; + } else + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call exist..!!"); + } + CALL_ENG_DEBUG(ENG_DEBUG, "active_call = %d ", active_call); + + /*An explicit call transfer by connecting the two parties where in one party being + active (active state) and another party being held (held state) */ + tapi_err = tel_exe_call_explicit_transfer(active_call, &ReqId); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_exe_call_explicit_transfer() Failed, Error Code: %d", tapi_err); + return FALSE; + } + + return TRUE; +} + +/** + * This function sends the given string as dtmf + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + * @param[in] dtmf_string dtmf string + */ +gboolean _vc_core_tapi_rqst_start_dtmf(call_vc_callagent_state_t *pcall_agent, char *dtmf_string) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + int ReqId = VC_RQSTID_DEFAULT; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "Start DTMF!! string = %s", dtmf_string); + + _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &call_handle); + + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Active Call Handle.."); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "string = %s", dtmf_string); + + /* start DTMF */ + /*This function sends one or more DTMF digits during call */ + tapi_err = tel_send_call_dtmf(dtmf_string, &ReqId); + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tapi_call_dtmf Failed, Error Code: %d", tapi_err); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, " Ended..."); + + return TRUE; + +} + +#ifdef _SEND_UUSINFO_ +/** + * This function sends user to user information + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle The call handle for which the information has to be sent + * @param[in] pszUusData User data + */ +gboolean call_vc_send_uusinfo(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, char *pszUusData) +{ + TelCallUusInfo_t uusInfo; + int nPos; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + memset(&uusInfo, 0, sizeof(TelCallUusInfo_t)); + + uusInfo.bMoreDataPresent = FALSE; /*more_data_present = FALSE;*/ + uusInfo.ProtocolType = TAPI_CALL_UUS_PROTO_SPECIFIC; + uusInfo.UusType = TAPI_CALL_UUS_1; + uusInfo.UusDataLen = strlen(pszUusData); + + _vc_core_util_strcpy((char *)uusInfo.UusData, sizeof(uusInfo.UusData), pszUusData); + + nPos = _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &call_handle); + while (nPos != -1) { + /*TAPI API not available to send user info */ + /*tapi doen't supprot this api.*/ + /****************************************************************************************** + tapi_err = tapi_call_send_user_info(call_handle, &uusInfo); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tapi_call_send_user_info() Failed,Error Code: %d", tapi_err); + return FALSE; + } + ******************************************************************************************/ + nPos = _vc_core_cm_get_next_active_call_handle(&pcall_agent->call_manager, &call_handle, nPos); + } + + return TRUE; +} +#endif + +/** + * This function releases the call associate with the given call handle + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle handle of the call to be ended + */ +gboolean _vc_core_tapi_rqst_end_call_by_callhandle(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle) +{ + call_vc_call_objectinfo_t callobject_info; + int pReqId = VC_RQSTID_DEFAULT; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + if (FALSE == _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Call Object not available for call handle: %d", call_handle); + return FALSE; + + } + + if (VC_CALL_STATE_CONNECTED == callobject_info.state) { +#ifdef SINGLE_CALL_END + if (_vc_core_cm_get_call_member_count(&pcall_agent->call_manager) == 1) { + CALL_ENG_DEBUG(ENG_DEBUG, "End Single call.."); + + /* Use ReleaseAll api in case single call is ended - this is caused by modem limitation */ + tapi_err = tel_release_call_all(&pReqId); + } else +#endif + { + /*Releases the call identified by Call Handle irrespective of call is hold or active state */ + tapi_err = tel_release_call(call_handle, &pReqId); + } + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tapi_call_release Failed Call Handle: %d, Error Code: %d", call_handle, tapi_err); + return FALSE; + } + + _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_RELEASE_WAIT); + _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info); + return TRUE; + } + + return FALSE; +} + +/** + * This function ends a call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_end_call(call_vc_callagent_state_t *pcall_agent) +{ + gboolean ret_val = FALSE; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + switch (pcall_agent->callagent_state) { + case CALL_VC_CA_STATE_NORMAL: + case CALL_VC_CA_STATE_WAIT_HOLD: + case CALL_VC_CA_STATE_WAIT_UNHOLD: + { + + if (_vc_core_cm_isexists_active_call(&pcall_agent->call_manager)) { + ret_val = _vc_core_tapi_rqst_release_active_calls(pcall_agent); + if (TRUE == ret_val) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_RELEASE_ALL_ACTIVECALL); + } + } else if (_vc_core_cm_isexists_held_call(&pcall_agent->call_manager)) { + ret_val = _vc_core_tapi_rqst_release_held_calls(pcall_agent); + if (TRUE == ret_val) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_RELEASE_ALL_HOLDCALL); + } + } else { + _vc_core_cm_clear_endcall_member(&pcall_agent->call_manager); + } + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "No Action defined for current call agent state: %d", pcall_agent->callagent_state); + return FALSE; + } + + return TRUE; +} + +/** + * This function rejects a mobile terminated call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] budub TRUE - User Determined User Busy, FALSE - otherwise + * @param[out] error_code Error code + */ +gboolean _vc_core_tapi_rqst_reject_mt_call(call_vc_callagent_state_t *pcall_agent, gboolean budub, int *error_code) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + int pReqId = VC_RQSTID_DEFAULT; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "budub = %d", budub); + if (_vc_core_cm_isexists_incoming_call(&pcall_agent->call_manager) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming call does not exist"); + *error_code = ERROR_VOICECALL_NO_INCOMING_CALL_EXIST; + return FALSE; + } + + if (pcall_agent->io_state == VC_INOUT_STATE_INCOME_WAIT_RELEASE) { + CALL_ENG_DEBUG(ENG_DEBUG, " io_state is already VC_INOUT_STATE_INCOME_WAIT_RELEASE"); + /*return TRUE since call release has been already done and it is waiting for the release*/ + return TRUE; + } + + if (pcall_agent->io_state == VC_INOUT_STATE_NONE) { + CALL_ENG_DEBUG(ENG_DEBUG, "return FALSE io_state=%d", pcall_agent->io_state); + *error_code = ERROR_VOICECALL_ENGINE_STATE_NONE; + return FALSE; + } + + call_handle = _vc_core_cm_get_incoming_call_handle(&pcall_agent->call_manager); + + if (TRUE == budub) { + /*Reject the Call for User Busy Scenario */ + tapi_err = tel_answer_call(call_handle, TAPI_CALL_ANSWER_REJECT, &pReqId); + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, " tel_answer_call failed: %d", tapi_err); + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_NONE); + *error_code = ERROR_VOICECALL_TAPI_ERROR; + return FALSE; + } + } else { + /*Release the call to end it normally */ + if (FALSE == _vc_core_tapi_rqst_release_incoming_call(pcall_agent)) { + CALL_ENG_DEBUG(ENG_ERR, "Release Incoming Call Failed"); + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_NONE); + *error_code = ERROR_VOICECALL_TAPI_ERROR; + return FALSE; + } + } + + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_RELEASE); + return TRUE; +} diff --git a/call-engine/core/vc-core-util.c b/call-engine/core/vc-core-util.c new file mode 100755 index 0000000..77dc8c2 --- /dev/null +++ b/call-engine/core/vc-core-util.c @@ -0,0 +1,1111 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include "vc-core-engine.h" +#include "vc-core-util.h" +#include "vc-core-callagent.h" +#include "vc-core-callmanager.h" + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "appcore-common.h" + +#define CALL_VODAFONEUK_CLI_SHOW_ID "1470" +#define CALL_COMMON_CLI_SHOW_ID "*31#" +#define CALL_COMMON_CLI_HIDE_ID "#31#" + +#define ASCII_0 48 +#define ASCII_9 57 +#define ASCII_A 65 +#define ASCII_D 68 +#define ASCII_STAR 42 +#define ASCII_HASH 35 +#define ASCII_P 80 /*PDIAL_SEND_DTMF*/ +#define ASCII_p 112 /*PDIAL_SEND_DTMF*/ +#define ASCII_COMMA 44 /*PDIAL_SEND_DTMF*/ + +#define EIGTH_BIT 0x80 +#define SEVENTH_BIT 0x40 +#define SIXTH_BIT 0x20 +#define FIFTH_BIT 0x10 +#define FOURTH_BIT 0x08 +#define THIRD_BIT 0x04 +#define SECOND_BIT 0x02 +#define FIRST_BIT 0x01 + +#define CALLVC_MIN(x, y) ((x) <= (y) ? (x) : (y)) /*PDIAL_SEND_DTMF*/ +#define ISUSSDDIGIT(X) ((X >= '2') && (X <= '9')) +#define ISDIGIT(X) ((X >= '0') && (X <= '9')) +#define ISSSDIGITINCALL(X) ((X >= '7') && (X <= '9')) +#define IS1CHARUSSDDIGIT(X) ((X >= '1') && (X <= '9')) + +#define DATE_FORMAT_1 "EEMMMddyyyy" /* Thu Aug 23 2001 */ +#define TIME_12_TYPE "hma" /* 7:58 AM */ +#define TIME_24_TYPE "HHmm" /* 19:58 */ + +typedef enum _call_vc_emergency_number_type_t { + CALL_VC_NO_SIM_EMERGENCY, + CALL_VC_UK_EMERGENCY, + CALL_VC_UKRAINE_EMERGENCY, + CALL_VC_DEFAULT_EMERGENCY, + CALL_VC_EMERGENCY_TYPE_MAX +} call_vc_emergency_number_type_t; + + +#define CALL_VC_EMERGENCY_NUMBER_LEN_MAX 3 + +/************************************************************************************************************************** +#define CALL_VC_KOREA_EMERGENCY_NUMBERS_CNT 3 +static char gcall_vc_korea_emergency_numbers[CALL_VC_KOREA_EMERGENCY_NUMBERS_CNT][CALL_VC_EMERGENCY_NUMBER_LEN_MAX + 1] = { + "112", + "911", + "119" +}; +**************************************************************************************************************************/ + +#define CALL_VC_DEFAULT_EMERGENCY_NUMBERS_CNT 2 +static char gcall_vc_emergency_numbers[CALL_VC_DEFAULT_EMERGENCY_NUMBERS_CNT][CALL_VC_EMERGENCY_NUMBER_LEN_MAX + 1] = { + "112", + "911", +}; + +#define CALL_VC_UK_EMERGENCY_NUMBERS_CNT 3 +static char gcall_vc_uk_emergency_numbers[CALL_VC_UK_EMERGENCY_NUMBERS_CNT][CALL_VC_EMERGENCY_NUMBER_LEN_MAX + 1] = { + "112", + "911", + "999", +}; + +#define CALL_VC_UKAINE_EMERGENCY_NUMBERS_CNT 5 +static char gcall_vc_ukaine_emergency_numbers[CALL_VC_UKAINE_EMERGENCY_NUMBERS_CNT][CALL_VC_EMERGENCY_NUMBER_LEN_MAX + 1] = { + "112", + "911", + "01", + "02", + "03" +}; + +#define CALL_VC_ITALY_EMERGENCY_NUMBERS_CNT 6 +static char gcall_vc_italy_emergency_numbers[CALL_VC_ITALY_EMERGENCY_NUMBERS_CNT][CALL_VC_EMERGENCY_NUMBER_LEN_MAX + 1] = { + "112", + "911", + "999", + "110", + "118", + "115" +}; + +#define CALL_VC_NO_SIM_DEFAULT_EMERGENCY_NUMBERS_CNT 8 +static char gcall_vc_nosim_emergency_numbers[CALL_VC_NO_SIM_DEFAULT_EMERGENCY_NUMBERS_CNT][CALL_VC_EMERGENCY_NUMBER_LEN_MAX + 1] = { + "000", + "08", + "112", + "110", + "118", + "119", + "911", + "999" +}; + +/** +* This function checks the given number against the default emergency numbers list +* +* @internal +* @return TRUE if given number is found in the emergency number list, FALSE otherwise +* @param[out] pNumber number to be verified +*/ +static gboolean __vc_core_util_check_default_emergency_number(char *pNumber); + +/** + * This function publishes the event of a given publish type + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] src Telehone number from which call number needd to be parsed + * @param[out] dst Pointer to the buffer to store the parsed number + */ +gboolean _vc_core_util_remove_invalid_chars(const char *src, char *dst) +{ + VOICECALL_RETURN_FALSE_IF_FAIL((src != NULL)); + VOICECALL_RETURN_FALSE_IF_FAIL((dst != NULL)); + + CALL_ENG_DEBUG(ENG_DEBUG, "Source phone number - %s\n",src); + int i = 0; + int j = 0; + int nSrc = 0; + + nSrc = strlen(src); + CALL_ENG_DEBUG(ENG_DEBUG, , "source String len - %d\n", nSrc); + + for(i = 0; i < nSrc; ++i) + { + switch(src[i]) + { + case '(': + { + if(src[i+1]== '0') + ++i; + break; + } + + case ')': + case '-': + case ' ': + case '/': + { + break; + } + + default: + { + dst[j++] = src[i]; + break; + } + } + if(j>40) + { + break; + } + } + + dst[j] = '\0'; + CALL_ENG_DEBUG(ENG_DEBUG, , "Destination phone number - %s\n",dst); + + return TRUE; +} + +/** + * This function publishes the event of a given publish type + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pszTelNumber Telehone number from which call number nned to be extracted + * @param[out] pBuffer Pointer to the buffer to store the extracted number + * @param[in] nBufSize Size of input buffer + */ +gboolean _vc_core_util_extract_call_number(const char *pszTelNumber, char *pBuffer, const int nBufSize) +{ + char *pszNum = NULL; + char *pst = NULL; + + VOICECALL_RETURN_FALSE_IF_FAIL((pBuffer != NULL)); + VOICECALL_RETURN_FALSE_IF_FAIL((pszTelNumber != NULL)); + + CALL_ENG_DEBUG(ENG_DEBUG, "number = %s..", pszTelNumber); + + memset(pBuffer, 0, nBufSize); + + if ((strncmp(pszTelNumber, CALL_COMMON_CLI_SHOW_ID, 4) == 0) || (strncmp(pszTelNumber, CALL_COMMON_CLI_HIDE_ID, 4) == 0)) + pszNum = (char *)pszTelNumber + 4; + else + pszNum = (char *)pszTelNumber; + + pst = strchr(pszNum, 'P'); + + if (pst == NULL) + pst = strchr(pszNum, 'p'); + + if (pst == NULL) + pst = strchr(pszNum, ','); /*browser request*/ + + if (pst == NULL) { + if (strlen(pszNum) == 0) + return FALSE; + _vc_core_util_strcpy(pBuffer, nBufSize, pszNum); + } else { + if (pst == pszNum) + return FALSE; + + _vc_core_util_strcpy(pBuffer, min((((int)pst - (int)pszNum)+1), (nBufSize)), pszNum); + } + return TRUE; +} + +gboolean _vc_core_util_extract_call_number_without_cli(const char *pszTelNumber, char *pBuffer, const int nBufSize) +{ + char *pszNum = NULL; + char *pst = NULL; + + VOICECALL_RETURN_FALSE_IF_FAIL((pszTelNumber != NULL)); + VOICECALL_RETURN_FALSE_IF_FAIL((pBuffer != NULL)); + + CALL_ENG_DEBUG(ENG_DEBUG, "number = %s..", pszTelNumber); + + memset(pBuffer, 0, nBufSize); + pszNum = (char *)pszTelNumber; + pst = strchr(pszNum, 'P'); + + if (pst == NULL) + pst = strchr(pszNum, 'p'); + + if (pst == NULL) + pst = strchr(pszNum, ','); /*browser request*/ + + if (pst == NULL) { + if (strlen(pszNum) == 0) + return FALSE; + _vc_core_util_strcpy(pBuffer, nBufSize, pszNum); + } else { + if (pst == pszNum) + return FALSE; + + _vc_core_util_strcpy(pBuffer, min((((int)pst - (int)pszNum)+1), (nBufSize)), pszNum); + } + return TRUE; +} + +/** +* This function checks the validity of the given string for SS string + * +* @return Returns SS_SI_FORMAT_INVALID - if the string is invalid ss string, SS_SI_FORMAT_VALID - if valid +* @param[in] pinput_string string to be verified + */ +call_vc_ss_si_format _vc_core_util_check_si_format(const char *pinput_string) +{ + int index = 0, pos = 1, cnt = 0; + VOICECALL_RETURN_VALUE_IF_FAIL((pinput_string != NULL),SS_SI_FORMAT_INVALID); + + if ((pinput_string[1] == '*') || (pinput_string[1] == '#')) + pos = 2; + + index = pos; + + while (cnt < 1) { + if (pinput_string[index++] == '*') + cnt++; + + if (index >= strlen(pinput_string + pos)) { + CALL_ENG_DEBUG(ENG_DEBUG, "valid ss format..."); + return SS_SI_FORMAT_VALID; + } + } + + return SS_SI_FORMAT_VALID; +} + +gboolean _vc_core_util_get_mcc(unsigned long *mcc) +{ + int ret = 0; + int plmn_value = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL((mcc != NULL)); + + ret = vconf_get_int(VCONFKEY_TELEPHONY_PLMN, &plmn_value); + if (0 == ret) { + char mcc_value[4]; + char plmn_string[10]; + + CALL_ENG_DEBUG(ENG_DEBUG, "plmn_value = [%d]", plmn_value); + + memset(plmn_string, 0, sizeof(plmn_string)); + memset(mcc_value, 0, sizeof(mcc_value)); + + snprintf(plmn_string, 10, "%d", plmn_value); + + /*First 3 digits of plmn value constitutes the mcc value */ + _vc_core_util_strcpy(mcc_value, 4, plmn_string); + *mcc = (unsigned long)atoi(mcc_value); + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..[%d]", ret); + *mcc = CALL_NETWORK_MCC_UK; + } + CALL_ENG_DEBUG(ENG_DEBUG, "mcc = %ld", *mcc); + + return TRUE; +} + +static gboolean __vc_core_util_check_default_emergency_number(char *pNumber) +{ + int i = 0; + unsigned long mcc = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL((pNumber != NULL)); + + _vc_core_util_get_mcc(&mcc); + + if (mcc == CALL_NETWORK_MCC_UK) { + /*112, 911,999*/ + for (i = 0; i < CALL_VC_UK_EMERGENCY_NUMBERS_CNT; i++) { + if (!strcmp(pNumber, gcall_vc_uk_emergency_numbers[i])) + return TRUE; + } + } else if (mcc == CALL_NETWORK_MCC_UKRAINE) { + /*112, 911, 01, 02, 03*/ + for (i = 0; i < CALL_VC_UKAINE_EMERGENCY_NUMBERS_CNT; i++) { + if (!strcmp(pNumber, gcall_vc_ukaine_emergency_numbers[i])) + return TRUE; + } + } else if (mcc == CALL_NETWORK_MCC_ITALY) { + /*112, 911, 999, 110, 118, 115*/ + for (i = 0; i < CALL_VC_ITALY_EMERGENCY_NUMBERS_CNT; i++) { + if (!strcmp(pNumber, gcall_vc_italy_emergency_numbers[i])) + return TRUE; + } + } else { + /*112, 911*/ + for (i = 0; i < CALL_VC_DEFAULT_EMERGENCY_NUMBERS_CNT; i++) { + if (!strcmp(pNumber, gcall_vc_emergency_numbers[i])) + return TRUE; + } + } + return FALSE; +} + +/** + * This function checks whether the given number is emergency number by verifying with sim emergency numbers + * + * @return TRUE if the number is emergency number, FALSE otherwise + * @param[in] card_type simcard type + * @param[in] pNumber number to be verified + */ +gboolean _vc_core_util_check_emergency_number(TelSimCardType_t card_type, char *pNumber, gboolean b_is_no_sim, int *ecc_category) +{ + int i = 0; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + VOICECALL_RETURN_FALSE_IF_FAIL(pNumber != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(ecc_category != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "pNumber = %s", pNumber); + *ecc_category = 0; + + /*if(call_vc_util_get_sim_mode() == CALL_VC_SIM_INSERTED)*/ + if (b_is_no_sim == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "We have a SIM"); + switch (card_type) { + case TAPI_SIM_CARD_TYPE_GSM: + { + TelSimEccData_t sim_ecc_info; /* used to get data for the Ecc information for 2G and 3G. */ + int necc_record_count = 0; /*Used to count number of Emergency records */ + + CALL_ENG_DEBUG(ENG_DEBUG, "[SimCardType=SIM_CARD_TYPE_GSM]"); + memset(&sim_ecc_info, 0x00, sizeof(TelSimEccData_t)); + + /*TAPI api Compliance */ + /*To get Emergency data of 2G */ + tapi_err = tel_get_sim_ecc(&sim_ecc_info, &necc_record_count); + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tapi_sim_get_ecc_info failed, tapi_err=%d", tapi_err); + return FALSE; + } + + if (necc_record_count == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "eccinfo is NOT exist. Check default"); + + /*SIM card inserted but no ecc infomation. Then check the default ECC number.*/ + return __vc_core_util_check_default_emergency_number(pNumber); + } else { + /*Check the availablity of Emergency number in the ECCInfo*/ + CALL_ENG_DEBUG(ENG_DEBUG, "ecc1=%s", sim_ecc_info.EccInfo.szEcc1); + if (strcmp(pNumber, sim_ecc_info.EccInfo.szEcc1) == 0) /*ecc1*/ + return TRUE; + + CALL_ENG_DEBUG(ENG_DEBUG, "ecc2=%s", sim_ecc_info.EccInfo.szEcc2); + if (strcmp(pNumber, sim_ecc_info.EccInfo.szEcc2) == 0) /*ecc2*/ + return TRUE; + + CALL_ENG_DEBUG(ENG_DEBUG, "ecc3=%s", sim_ecc_info.EccInfo.szEcc3); + if (strcmp(pNumber, sim_ecc_info.EccInfo.szEcc3) == 0) /*ecc3*/ + return TRUE; + + CALL_ENG_DEBUG(ENG_DEBUG, "ecc4=%s", sim_ecc_info.EccInfo.szEcc4); + if (strcmp(pNumber, sim_ecc_info.EccInfo.szEcc4) == 0) /*ecc4*/ + return TRUE; + + CALL_ENG_DEBUG(ENG_DEBUG, "ecc5=%s", sim_ecc_info.EccInfo.szEcc5); + if (strcmp(pNumber, sim_ecc_info.EccInfo.szEcc5) == 0) /*ecc5*/ + return TRUE; + + CALL_ENG_DEBUG(ENG_DEBUG, "No match & check default emergency number..."); + + return __vc_core_util_check_default_emergency_number(pNumber); + } + } + break; + case TAPI_SIM_CARD_TYPE_USIM: + { + TelSimEccData_t sim_usim_ecc_info; /* used to get data for the Ecc information for both 2G and 3G */ + int nuecc_rec_count = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, "SimCardType=SIM_CARD_TYPE_USIM"); + + memset(&sim_usim_ecc_info, 0x00, sizeof(TelSimEccData_t)); + + /*Synchronous function used to get ECC data */ + tapi_err = tel_get_sim_ecc(&sim_usim_ecc_info, &nuecc_rec_count); + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tapi_sim_get_usim_ecc_info failed, tapi_err=%d", tapi_err); + return FALSE; + } + + if (nuecc_rec_count == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "ueccInfo is NOT exists..."); + + /*SIM card inserted but no ecc infomation. Then check the default ECC number.*/ + return __vc_core_util_check_default_emergency_number(pNumber); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "ueccInfo exists..."); + + /*Check in USIM Emergency Numbers*/ + for (i = 0; i < nuecc_rec_count; i++) { + CALL_ENG_DEBUG(ENG_DEBUG, "[ecc=%s, category:[%d]]", sim_usim_ecc_info.UeccInfo[i].szEcc, sim_usim_ecc_info.UeccInfo[i].EccEmergencyServiceInfo); + if (!strcmp(pNumber, sim_usim_ecc_info.UeccInfo[i].szEcc)) { + *ecc_category = sim_usim_ecc_info.UeccInfo[i].EccEmergencyServiceInfo; + CALL_ENG_DEBUG(ENG_DEBUG, "uecc matched!!"); + return TRUE; + } + } + + CALL_ENG_DEBUG(ENG_DEBUG, "No match & check default emergency number..."); + return __vc_core_util_check_default_emergency_number(pNumber); + } + } + break; + + case TAPI_SIM_CARD_TYPE_UNKNOWN: + default: + { + return __vc_core_util_check_default_emergency_number(pNumber); + } + break; + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "No SIM!"); + for (i = 0; i < CALL_VC_NO_SIM_DEFAULT_EMERGENCY_NUMBERS_CNT; i++) { + if (!strcmp(pNumber, gcall_vc_nosim_emergency_numbers[i])) + return TRUE; + } + } + + CALL_ENG_DEBUG(ENG_DEBUG, "No emegency number..."); + return FALSE; +} + +/** + * This function checks whether the given number is SS string or not + * + * @return TRUE if the number is SS string, FALSE otherwise + * @param[in] pNumber number to be verified + */ +gboolean _vc_core_util_check_ss_string(const char *pNumber) +{ + int len; + VOICECALL_RETURN_FALSE_IF_FAIL(pNumber != NULL); + CALL_ENG_DEBUG(ENG_DEBUG, "pNumber(%s)",pNumber); + + len = strlen(pNumber); + + if(len > 3) { + if(pNumber[len-1] == '#') { + if(pNumber[0] == '*' || pNumber[0] == '#') { + return TRUE; + } + } + else { + /* + * '*31#', '#31#' -> launch CISS + * '*31#nn..', '#31#nn...' -> launch Voice-call + */ + if(strncmp (pNumber, CALL_COMMON_CLI_SHOW_ID, 4) == 0 + || strncmp (pNumber, CALL_COMMON_CLI_HIDE_ID, 4) == 0) { + if(len > 4) + return FALSE; + return TRUE; + } + } + } + + if((len == 2) && (ISUSSDDIGIT( pNumber[0] ) && ISDIGIT( pNumber[1] ))) { + CALL_ENG_DEBUG(ENG_DEBUG, "USSD string"); + return TRUE; + } + + if((len == 1) && (IS1CHARUSSDDIGIT(pNumber[0]))) { + CALL_ENG_DEBUG(ENG_DEBUG, "1 character USSD string"); + return TRUE; + } + + return FALSE; +} + +/** + * This function checks whether the given number is in CALL SS string or not + * + * @return TRUE if the number is in call SS string, FALSE otherwise + * @param[in] pNumber number to be verified + */ +gboolean _vc_core_util_check_incall_ss_string(const char *number) +{ + int len; + int num_int; + VOICECALL_RETURN_FALSE_IF_FAIL(number != NULL); + CALL_ENG_DEBUG(ENG_DEBUG, "number(%s)",number); + + len = strlen(number); + if(len > 2 || len < 1) + return FALSE; + + if(number[0] > '6') + return FALSE; + + if(len == 1) { + /* 0 ~ 4 */ + if(number[0] >= '0' && number[0] <= '4') + return TRUE; + } + else { + /* 11 ~ 17, 21 ~ 27 */ + num_int = atoi(number); + + if(num_int >= 11 && num_int <= 17) + return TRUE; + if(num_int >= 21 && num_int <= 27) + return TRUE; + } + + return FALSE; +} + + + +/*PDIAL_SEND_DTMF*/ +/** +* This function extracts the dtmf number from the given telephone number +* +* @param[in] tel_number source telephone number +* @param[out] dtmf_number extracted dtmf number +* @param[out] dtmf_buf_len size of dtmf number buffer +*/ +gboolean _vc_core_util_extract_dtmf_number(const char *tel_number, char *dtmf_number, const int dtmf_buf_len) +{ + char *pst; + VOICECALL_RETURN_FALSE_IF_FAIL(tel_number!= NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(dtmf_number != NULL); + + memset(dtmf_number, 0, dtmf_buf_len); + + pst = strchr(tel_number, 'P'); + if (pst == NULL) { + pst = strchr(tel_number, 'p'); + } + + if (pst == NULL) { + pst = strchr(tel_number, ','); /*Considering "," as Pause charcter - Browser Request */ + } + + if (pst == NULL) { + return FALSE; + } else { + _vc_core_util_strcpy(dtmf_number, CALLVC_MIN((int)strlen(pst), (dtmf_buf_len - 1)), pst + 1); + } + return TRUE; +} + +/*PDIAL_SEND_DTMF*/ + +/** +* This function checks whether the given number ia a valid dtmf number or not +* +* @return TRUE if the number can be used for sending dtmf , FALSE otherwise +* @param[in] pnumber number to be verified +*/ +gboolean _vc_core_util_isvalid_dtmf_number(char *pnumber) +{ + int len = 0; + VOICECALL_RETURN_FALSE_IF_FAIL(pnumber != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_util_isvalid_dtmf_number.. entering"); + + if (NULL == pnumber || (len = strlen(pnumber)) <= 0) { + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Length = %d", len); + while (len > 0) { + /*PDIAL_SEND_DTMF*/ + if (IS_DIGIT(pnumber[len - 1]) || (pnumber[len - 1] >= ASCII_A && pnumber[len - 1] <= ASCII_D) || (pnumber[len - 1] == ASCII_STAR || pnumber[len - 1] == ASCII_HASH)) { + return TRUE; + } + len--; + } + return FALSE; +} + +/** +* This function checks whether the given number ia a valid dtmf number or not +* +* @return TRUE if the number can be used for sending dtmf , FALSE otherwise +* @param[in] pnumber number to be verified +*/ +gboolean _vc_core_util_isvalid_full_dtmf_number(char *pnumber) +{ + int len = 0; + VOICECALL_RETURN_FALSE_IF_FAIL(pnumber != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_util_isvalid_dtmf_number.. entering"); + + if (NULL == pnumber || (len = strlen(pnumber)) <= 0) { + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Length = %d", len); + while (len > 0) { + /*PDIAL_SEND_DTMF*/ + if (!(IS_DIGIT(pnumber[len - 1]) || (pnumber[len - 1] >= ASCII_A && pnumber[len - 1] <= ASCII_D) || (pnumber[len - 1] == ASCII_STAR || pnumber[len - 1] == ASCII_HASH) || (pnumber[len - 1] == ASCII_P || pnumber[len - 1] == ASCII_p || pnumber[len - 1] == ASCII_COMMA))) { + CALL_ENG_DEBUG(ENG_DEBUG, "invalid character encountered..."); + return FALSE; + } + len--; + } + CALL_ENG_DEBUG(ENG_DEBUG, "Fully valid DTMF string.."); + return TRUE; +} + +/** +* This function checks the validity of the given telephone number +* +* @return TRUE if the given number is valid telephone number, FALSE otherwise +* @param[in] ptel_number telephone number to be verified +*/ +gboolean _vc_core_util_isvalid_telephone_number(char *ptel_number) +{ + int len = 0; + int i = 0; + VOICECALL_RETURN_FALSE_IF_FAIL(ptel_number != NULL); + + if (ptel_number != NULL) { + char call_number[VC_PHONE_NUMBER_LENGTH_MAX] = { 0, }; + + /* + * If user Input "*" or "#" and then make a call, + * the device should alert you that the phone number is incorrect. + */ + /* if ((strlen(ptel_number) == 1) && ((strcmp(ptel_number, "*") == 0) ||(strcmp(ptel_number, "#") == 0))) */ + /* 1 digit number -> wrong number popup */ + if (strlen(ptel_number) == 1) { + CALL_ENG_DEBUG(ENG_DEBUG, "It is wrong number.(1 digit number)"); + return FALSE; + } + /*end*/ + + /*To avoid checking *31# and #31# */ + if (_vc_core_util_extract_call_number(ptel_number, call_number, sizeof(call_number)) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "No proper number = %s", ptel_number); + return FALSE; + } + + len = strlen(call_number); + for (i = 0; i < len; i++) { + /*'+' should be allowed only as first digit of the dialling number */ + if (i >= 1 && call_number[i] == '+') { + return FALSE; + } + + if (!IS_DIGIT(call_number[i]) && call_number[i] != '+' && call_number[i] != ASCII_STAR && call_number[i] != ASCII_HASH && call_number[i] != 'P' && call_number[i] != 'p' && call_number[i] != ',') { + return FALSE; + } + } + return TRUE; + } + return FALSE; +} + +gboolean _vc_core_util_check_gcf_status(void) +{ + gboolean bgcf_status = FALSE; + int ret = -1; + + ret = vconf_get_int(VCONFKEY_ADMIN_GCF_TEST, &bgcf_status); + if (0 == ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bgcf_status = [%d]", bgcf_status); + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..[%d]", ret); + } + + return bgcf_status; +} + +gboolean _vc_core_util_check_zuhause_status(void) +{ + int isZuhauseArea = 0; + int ret = -1; + + ret = vconf_get_int(VCONFKEY_TELEPHONY_ZONE_ZUHAUSE, &isZuhauseArea); + if (0 == ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "isZuhauseArea = [%d]", isZuhauseArea); + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..[%d]", ret); + } + + if (isZuhauseArea == 0) { + /*Not in a zuhause area..*/ + return FALSE; + } else { + /*in a zuhause area..*/ + return TRUE; + } +} + +/*********************************************************************/ +gboolean _vc_core_util_set_call_status(int call_status) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "call_status = [%d]", call_status); + + if (vconf_set_int(VCONFKEY_CALL_STATE, call_status)) { + CALL_ENG_DEBUG(ENG_DEBUG, "vconf_set_int failed."); + return FALSE; + } + return TRUE; +} + +gboolean _vc_core_util_set_call_volume(int vol_level) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "vol_level = [%d]", vol_level); + + if (vconf_set_int(VCONFKEY_CALL_VOLUME_LEVEL, vol_level)) { + CALL_ENG_DEBUG(ENG_WARN, "vconf_set_int failed."); + return FALSE; + } + return TRUE; +} + +int _vc_core_util_get_call_volume(void) +{ + int vol_level = 0; + + if (vconf_get_int(VCONFKEY_CALL_VOLUME_LEVEL, &vol_level)) { + CALL_ENG_DEBUG(ENG_WARN, "vconf_set_int failed."); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "vol_level(%d)",vol_level); + return vol_level; +} + +gboolean _vc_core_util_check_video_call_status(void) +{ + int call_status = 0; + int ret = -1; + + ret = vconf_get_int(VCONFKEY_CALL_STATE, &call_status); + if (0 == ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "call_status = [%d]", call_status); + if (call_status == VCONFKEY_CALL_VIDEO_CONNECTING || call_status == VCONFKEY_CALL_VIDEO_ACTIVE) { + return TRUE; + } + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..[%d]", ret); + } + return FALSE; +} + +gboolean _vc_core_util_get_SAP_status() +{ + int bt_status = VCONFKEY_BT_DEVICE_NONE; + gboolean ret = FALSE; + + ret = vconf_get_int(VCONFKEY_BT_DEVICE, &bt_status); + if (0 == ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bt_status = [0x%x]", bt_status); + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..[%d]", ret); + } + + if (bt_status == VCONFKEY_BT_DEVICE_SAP_CONNECTED) { + return TRUE; + } else { + return FALSE; + } +} + +void _vc_core_util_get_cug_info(voicecall_setup_info_t *psetupcall_info) +{ + VOICECALL_RETURN_IF_FAIL(psetupcall_info != NULL); + voicecall_cug_info_t *pcug_info = NULL; + /*int error_code = -1;*/ + + pcug_info = (voicecall_cug_info_t *) &psetupcall_info->cug_info; + + /*Get the CUG Information from the Settings */ + memset(&psetupcall_info->cug_info, 0, sizeof(voicecall_cug_info_t)); + pcug_info->bcug_used = 0; +} + +void _vc_core_util_get_identity_mode(voicecall_setup_info_t *psetupcall_info) +{ + int id_mode = 0; /*0 - default, 1-show, 2-hide*/ + int ret = -1; + VOICECALL_RETURN_IF_FAIL(psetupcall_info != NULL); + + ret = vconf_get_int(VCONFKEY_CISSAPPL_SHOW_MY_NUMBER_INT, &id_mode); + if (0 == ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "id_mode = [%d]", id_mode); + psetupcall_info->identity_mode = id_mode; + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..[%d]", ret); + psetupcall_info->identity_mode = 0; + } +} + +gboolean _vc_core_util_is_offline_mode(void) +{ + gboolean bstatus = -1; + + if (vconf_get_bool(VCONFKEY_SETAPPL_FLIGHT_MODE_BOOL, &bstatus)) { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_bool failed."); + return FALSE; + } + CALL_ENG_DEBUG(ENG_DEBUG, "bstatus:[%d]", bstatus); + + return bstatus; +} + +gboolean _vc_core_util_is_pwlock(void) +{ + int pwlock_state = -1; + + if (vconf_get_int(VCONFKEY_PWLOCK_STATE, &pwlock_state)) { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed."); + return FALSE; + } + CALL_ENG_DEBUG(ENG_DEBUG, "pwlock_state:[%d]", pwlock_state); + if ((pwlock_state == VCONFKEY_PWLOCK_BOOTING_LOCK) || (pwlock_state == VCONFKEY_PWLOCK_RUNNING_LOCK)) { + return TRUE; + } else { + return FALSE; + } +} + +gboolean _vc_core_util_get_nw_status(int *network_status) +{ + int svc_type = -1; + gboolean ret = FALSE; + VOICECALL_RETURN_FALSE_IF_FAIL(network_status != NULL); + + ret = vconf_get_int(VCONFKEY_TELEPHONY_SVCTYPE, &svc_type); + if (0 == ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "svc_type = [%d]", svc_type); + *network_status = svc_type; + return TRUE; + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..[%d]", ret); + return FALSE; + } +} + +/* Function Definitions */ +/** + * This function copies the source string to the target string according to the size of the destination string + * + * @return Returns newly copied string on success or NULL on failure + * @param[out] pbuffer Target Buffer + * @param[in] buf_count Size of Target Buffer + * @param[in] pstring Source String + */ +gboolean _vc_core_util_strcpy(char *pbuffer, int buf_count, const char *pstring) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pbuffer != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(pstring != NULL); + + if (buf_count == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "buf_count is zero!!"); + return FALSE; + } + +#ifdef _NO_USE_STRCPY_ + if ((buf_count - 1) >= (int)strlen(pstring)) { + strcpy(pbuffer, pstring); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "pbuffer size is smaller than pstring!!"); + strncpy(pbuffer, pstring, (buf_count - 1)); + pbuffer[buf_count - 1] = '\0'; + } +#else + CALL_ENG_DEBUG(ENG_DEBUG, "pbuffer size(%d), pstring size(%d)", buf_count, strlen(pstring)); + strncpy(pbuffer, pstring, (buf_count - 1)); + pbuffer[buf_count - 1] = '\0'; +#endif + return TRUE; +} + +/** + * This function make the date and time string + * + * @return Returns newly copied string on success or NULL on failure + * @param[out] pbuffer Target Buffer + * @param[in] time time + */ +char *_vc_core_util_get_date_time(time_t time) +{ + int ret = 0; + UDate date; + const char *locale = uloc_getDefault(); + UErrorCode status = U_ZERO_ERROR; + UDateTimePatternGenerator *generator; + UDateFormat *formatter; + UChar bestPattern[64] = { '\0', }; + UChar formatted[64] = { '\0', }; + char bestPatternString[128] = { '\0', }; + char formattedString[128] = { '\0', }; + int32_t bestPatternCapacity, formattedCapacity; + int32_t bestPatternLength, formattedLength; + char skeleton[128]={ '\0', }; + UChar customSkeleton[64] = { '\0', }; + enum appcore_time_format time_format; + + appcore_get_timeformat(&time_format); + + switch(time_format) { + case APPCORE_TIME_FORMAT_12: + snprintf(skeleton, sizeof(skeleton), "%s%s", DATE_FORMAT_1, TIME_12_TYPE); + break; + case APPCORE_TIME_FORMAT_24: + snprintf(skeleton, sizeof(skeleton), "%s%s", DATE_FORMAT_1, TIME_24_TYPE); + break; + case APPCORE_TIME_FORMAT_UNKNOWN: + default: + snprintf(skeleton, sizeof(skeleton), "%s%s", DATE_FORMAT_1, TIME_24_TYPE); + break; + } + + u_uastrncpy(customSkeleton, skeleton,strlen(skeleton)); + + generator = udatpg_open(locale, &status); + bestPatternCapacity = (int32_t)(sizeof(bestPattern)/sizeof((bestPattern)[0])); + + bestPatternLength = udatpg_getBestPattern(generator, customSkeleton, u_strlen(customSkeleton), bestPattern, bestPatternCapacity, &status); + u_austrncpy(bestPatternString, bestPattern, 128); + + CALL_ENG_DEBUG(ENG_DEBUG, "BestPattern(%s)", bestPatternString); + + date = (UDate) time * 1000; + + formatter = udat_open(UDAT_IGNORE, UDAT_IGNORE, locale, NULL, -1, bestPattern, -1, &status); + + /* UDAT_IGNORE Passed so that our best pattern is used in generating pattern */ + formattedCapacity = (int32_t)(sizeof(formatted)/sizeof((formatted)[0])); + formattedLength = udat_format(formatter, date, formatted, formattedCapacity, NULL, &status); + u_austrncpy(formattedString, formatted, 128); + udatpg_close(generator); + udat_close(formatter); + + CALL_ENG_DEBUG(ENG_DEBUG, "DATE & TIME(%s)", formattedString); + return g_strdup(formattedString); +} + + +gboolean _vc_core_util_set_sleep_status(call_vc_power_mode_t type) +{ + return FALSE; /*it will be processed with sensor in ui*/ +} + +gboolean _vc_core_util_get_call_alert_type(int *alert_type) /*VCONFKEY_SETAPPL_PROFILE_CURRENT_CALL_ALERT_TYPE_INT*/ +{ + int tmp_alert_type = -1; + gboolean ret = FALSE; + char *vconf_key = NULL; + VOICECALL_RETURN_FALSE_IF_FAIL(alert_type != NULL); + + vconf_key = vconf_get_str("db/setting/cur_profile"); + strncat(vconf_key, "/call_alert_type", strlen("/call_alert_type")); + ret = vconf_get_int(vconf_key, &tmp_alert_type); + CALL_ENG_DEBUG(ENG_DEBUG, "vconf_key = [%s]", vconf_key); + if (0 == ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "alert_type = [%d]", tmp_alert_type); /*SETTING_CALL_ALERT_TYPE_MELODY,...*/ + *alert_type = tmp_alert_type; + return TRUE; + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..[%d]", ret); + return FALSE; + } +} + +gboolean _vc_core_util_phonelock_status(void) +{ + gboolean b_phonelock = FALSE; + if (!vconf_get_bool(VCONFKEY_SETAPPL_STATE_POWER_ON_LOCK_BOOL, &b_phonelock)) { + CALL_ENG_DEBUG(ENG_DEBUG, "b_phonelock:[%d]", b_phonelock); + return b_phonelock; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "get VCONFKEY_SETAPPL_STATE_POWER_ON_LOCK_BOOL failed.."); + return FALSE; + } +} + +#ifdef TIMER_ENABLED +clock_t _vc_core_util_get_curr_time() +{ + struct timeval tv; + long cur_time; + gettimeofday(&tv, NULL); + + cur_time = (tv.tv_sec * 1000) + tv.tv_usec / 1000; + return cur_time; +} + +void _vc_core_util_print_diff_time(clock_t start, clock_t end, char *message) +{ + long elapsed_time = 0; + elapsed_time = (end - start); + VOICECALL_RETURN_IF_FAIL(message != NULL); + fprintf(stderr, "\n[VoiceCall TIMER][%s]:\n[%s]\n\tstart time: %ld; end time: %ld; total time: %ld milli seconds\n", __func__, message, start, end, elapsed_time); +} + +void _vc_core_util_print_curr_time(char *message) +{ + clock_t curr_time = _vc_core_util_get_curr_time(); + VOICECALL_RETURN_IF_FAIL(message != NULL); + fprintf(stderr, "\n[VoiceCall TIMER][%s]:\n[%s]\n\t time: [%ld] milli seconds\n", __func__, message, curr_time); +} +#endif + +void _vc_core_util_download_test_call(char *result) +{ + int ret; + FILE *d_call_test = NULL; + char string[20] = { }; + + VOICECALL_RETURN_IF_FAIL(result != NULL); + + /*create string*/ + snprintf(string, sizeof(string), "/tmp/%s", result); + + d_call_test = fopen(string, "w"); + if (d_call_test == NULL) { + CALL_ENG_DEBUG(ENG_DEBUG, "FAIL:fopen(%s)", string); + return; + } + /*ret = fwrite("\0", sizeof(char), 1, d_call_test);*/ + /*CALL_ENG_DEBUG(ENG_DEBUG,"Result:fwrite(%d)", ret);*/ + + ret = fclose(d_call_test); + CALL_ENG_DEBUG(ENG_DEBUG, "Result:fwrite(%d)", ret); + if (ret != 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "FAIL:fclose\n"); + return; + } + +} diff --git a/call-engine/etc/rc.d/init.d/voice-calld b/call-engine/etc/rc.d/init.d/voice-calld new file mode 100755 index 0000000..1eb7128 --- /dev/null +++ b/call-engine/etc/rc.d/init.d/voice-calld @@ -0,0 +1,7 @@ +#!/bin/sh +# +# Script for voice call daemon during booting time +# +if [ -x /usr/bin/voice-calld ]; then + /usr/bin/voice-calld & +fi diff --git a/call-engine/etc/rc.d/rc3.d/S60voice-calld b/call-engine/etc/rc.d/rc3.d/S60voice-calld new file mode 100755 index 0000000..1eb7128 --- /dev/null +++ b/call-engine/etc/rc.d/rc3.d/S60voice-calld @@ -0,0 +1,7 @@ +#!/bin/sh +# +# Script for voice call daemon during booting time +# +if [ -x /usr/bin/voice-calld ]; then + /usr/bin/voice-calld & +fi diff --git a/call-engine/include/voice-call-bt.h b/call-engine/include/voice-call-bt.h new file mode 100755 index 0000000..848c1d0 --- /dev/null +++ b/call-engine/include/voice-call-bt.h @@ -0,0 +1,201 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VOICE_CALL_BT_H_ +#define _VOICE_CALL_BT_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "voice-call-core.h" +#include "vconf.h" +#include "vconf-keys.h" + +#define BT_IPC_STRING_SIZE 256 + +/* Enum describes the AG request commands */ +typedef enum { + BT_AG_REQ_CONNECT, /**< Headset Connected */ + BT_AG_REQ_CONNECT_ERROR, /**< Headset Connection Failed */ + BT_AG_REQ_DISCONNECT, /**< Headset Disconnected */ + BT_AG_REQ_SPK_GAIN, /**< Speaker volume changed */ + BT_AG_REQ_MIC_GAIN, /**< Microphone gain changed */ + BT_AG_REQ_CALL_ACCEPTED, /**< Call accepted */ + BT_AG_REQ_CALL_REJECT, /**< Incoming call rejected */ + BT_AG_REQ_CALL_END, /**< Call Ended*/ + BT_AG_REQ_CALL_HOLD, /**< Put Call on Hold */ + BT_AG_REQ_CALL_RETRIEVE, /**< Retrieve held call */ + BT_AG_REQ_BUTTON_PRESSED, /**< Headset Button was pressed */ + BT_AG_REQ_CALL_REDIAL, /**< Handsfree requested call redial */ + BT_AG_REQ_CALL_2_SEND, /**< Places all active calls on hold and accepts the other call */ + BT_AG_REQ_CALL_3_SEND, /**< Adds a held call to the conversation */ + BT_AG_REQ_CALL_0_SEND, /**< Releases all held calls or sets User Determined User Busy for a waiting call */ + BT_AG_REQ_CALL_1_SEND, /**< Releases all active calls and accepts the other call */ + BT_AG_REQ_HEADSET_VOL, /**< Send current Headset Volume level to Call */ + BT_AG_REQ_SWITCH_TO_HEADSET,/**< Switch to HS */ + BT_AG_REQ_SWITCH_TO_PHONE, /**< Switch to Phone */ + BT_AG_REQ_DTMF, /**< Send DTMF tone */ + BT_AG_REQ_CALL_STATUS /**< Ask current call status */ +} connectivity_bt_ag_req_t; + +/* Enum describes the AG response commands. */ +typedef enum { + BT_AG_RES_CALL_ORIG, /**< Phone originated a call. */ + BT_AG_RES_CALL_INCOM, /**< Incoming call notification to Headset */ + BT_AG_RES_CALL_CONNECT, /**< Call connected */ + BT_AG_RES_CALL_END, /**< MO or MT call ended */ + BT_AG_RES_CALL_HOLD, /**< Call on Hold */ + BT_AG_RES_CALL_RETRIEVE, /**< Held call retrieved */ + BT_AG_RES_CALL_JOINED, /**< Held call joined */ + BT_AG_RES_SPK_GAIN, /**< Speaker volume changed */ + BT_AG_RES_MIC_GAIN, /**< Microphone gain changed */ + BT_AG_RES_CALL_REMOTE_RINGING, + /**< Remote party call alerted */ + BT_AG_RES_SWITCH_TO_HEADSET,/**< Switch to HS */ + BT_AG_RES_SWITCH_TO_PHONE, /**< Switch to Phone */ + BT_AG_RES_CALL_STATUS, /**< For call status information to headset */ + BT_AG_RES_HEADSET_VOL, /**< Request Current Headset Volume level from Call */ + BT_AG_RES_CALL_SWAPPED +} connectivity_bt_ag_res_t; + +/** +* This enum is for ag call status +*/ +typedef enum { + BT_AG_CALL_STATUS_NONE, /**< AG Call status is None */ + BT_AG_CALL_STATUS_DIALLING, /**< AG Call status is Dialing */ + BT_AG_CALL_STATUS_INCOMING, /**< Incoming Call */ + BT_AG_CALL_STATUS_INCOMING_HELD, + /**< Incoming call is held */ + BT_AG_CALL_STATUS_CONNECTED,/**< Call is connected */ + BT_AG_CALL_STATUS_HELD, /**< Call is held */ + BT_AG_CALL_STATUS_RETRIEVED,/**< Call is retrieved */ + BT_AG_CALL_STATUS_RETRIVING,/**< Call is retreving */ + BT_AG_CALL_STATUS_WAITING, /**< Incoming call Waiting */ + BT_AG_CALL_STATUS_ALERTING, /**< Remote Party being alerted in outgoing call */ + BT_AG_CALL_STATUS_CANDIDATE /**< The call hed state is moved to call_candidate */ +} connectivity_bt_ag_call_value_t; + +typedef enum { + BT_AG_RES_AUDIO_CONNECTION_ERROR = 0x00F0, + BT_AG_RES_AUDIO_DISCONNECTION_ERROR, +} connectivity_bt_ag_resp_status_t; + +typedef struct { + int param1; /* Req or Res Type */ + int param2; + int param3; + char param4[BT_IPC_STRING_SIZE]; +} __attribute__ ((packed)) connectivity_bt_ag_param_info_t; + +typedef struct { + unsigned int call_id; /**< Call identification */ + connectivity_bt_ag_call_value_t call_status; /**< Status of the call */ +} __attribute__ ((packed)) connectivity_bt_ag_call_status_info_t; + +gboolean _vc_bt_switch_headset_path(call_vc_core_state_t *pcall_core, gboolean bheadset, gboolean bsend_bt_response); + +/** + * This function sends event to BT for switch to Headset/Phone + * + * @return void + * @param[in] pcall_core Handle to voicecall core + * @param[in] bheadset TRUE if sound type is Audio Headset, FALSE otherwise + */ +void _vc_bt_request_switch_headset_path(call_vc_core_state_t *pcall_core, gboolean bheadset); + +/** + * This function handles the bluetooth notifications sent by blue tooth application + * + * @return TRUE -if event is handled, FALSE otherwise + * @param[in] pcall_core Handle to voicecall core + * @param[in] pbt_info bt notification details + */ +gboolean _vc_bt_handle_bt_events(call_vc_core_state_t *pcall_core, connectivity_bt_ag_param_info_t * pbt_info); + +/** + * This function sends response back to the bt application + * + * @return void + * @param[in] pcall_core Handle to voicecall core + * @param[in] bt_event bluetooth event type + * @param[in] param1 user param1 + * @param[in] param2 user param2 + */ +void _vc_bt_send_response_to_bt(call_vc_core_state_t *pcall_core, int bt_event, int param1, gpointer param2); + +/** + * This function register bt callback. + * + * @return TRUE if bt status is registered, FALSE otherwise + * @param[in] void + */ +gboolean _vc_bt_status_init(call_vc_core_state_t *pcall_core); + +/** + * This function gets the blue tooth active status from the phone status server + * + * @return TRUE - if BT is enabled, FALSE otherwise + * @param[in] none + */ +gboolean _vc_bt_get_bt_status(void); + +/** + * This function gets the BT inband ringtone activate settings + * + * @return TRUE - if BT inband ringtone activate settings is ON, FALSE otherwise + * @param[in] none + */ +gboolean _vc_bt_get_inband_ringtone_active(void); + +/** + * This function handles the notifications sent by phone status server + * + * @return TRUE -if notification is handled, FALSE otherwise + * @param[in] pcall_core Handle to voicecall core + * @param[in] bt_status Blue tooth status + */ +gboolean _vc_bt_handle_phonestatus_bt_events(keynode_t *node, call_vc_core_state_t *pcall_core); + +/** + * This function retreives volume level of headset + * + * @param[in] pcall_core Handle to voicecall core + */ +void _vc_bt_get_headset_volume(call_vc_core_state_t *pcall_core); + +/** + * This function returns the BT connection status + * + * @return TRUE if bt is connected, FALSE otherwise + * @param[in] pcall_core Handle to voicecall core + */ +gboolean _vc_bt_is_bt_connected(call_vc_core_state_t *pcall_core); + +/** + * This function returns the BT SCO status.(Synchronized Connection Oriented link) + * + * @return TRUE if bt is connected, FALSE otherwise + * @param[in] void + */ +gboolean _vc_bt_get_bt_sco_status(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/call-engine/include/voice-call-core.h b/call-engine/include/voice-call-core.h new file mode 100755 index 0000000..42028fd --- /dev/null +++ b/call-engine/include/voice-call-core.h @@ -0,0 +1,628 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VOICE_CALL_CORE_H_ +#define _VOICE_CALL_CORE_H_ + +#ifdef __cplusplus +extern "C" { + +#endif + +#include "vc-core-util.h" +#include "vc-core-engine-types.h" +#include "voice-call-sound.h" +#include "voice-call-engine.h" + +typedef enum _call_vc_core_flags_t { + CALL_VC_CORE_FLAG_NONE = 0x00000000, /**< NONE state */ + CALL_VC_CORE_FLAG_SOS_CALL_ONLY = 0x00000001, /**< SET - Emergency Calls Only, UNSET - All Calls Allowed */ + CALL_VC_CORE_FLAG_MSG_SVC_INIT = 0x00000002, /**< SET - Messenger service intialization done, UNSET - otherwise */ + CALL_VC_CORE_FLAG_FDN_SVC_ENABLED = 0x00000004, /**< SET - FDN enabled, UNSET - otherwise */ + CALL_VC_CORE_FLAG_VOL_CHNGD_BYBT = 0x00000008, /**< SET - volume change request from BT, UNSET - otherwise */ + CALL_VC_CORE_FLAG_BT_EVENT_WAITING = 0x00000010, /**< SET - Waiting for Switch Headset/Phone Event fom Bluetooth, UNSET - otherwise */ + CALL_VC_CORE_FLAG_IT_WAS_LOCKED = 0x00000020, /**< SET - It was locked when voice call app luanched, UNSET - otherwise */ + CALL_VC_CORE_FLAG_UNLOC_BY_SLIDER = 0x00000040, /**< SET - Voice call unlock by slider, UNSET - otherwise */ + CALL_VC_CORE_FLAG_EXPT_APPLET_QUIT = 0x00000080, /**< SET - Thread safe applet quit required, UNSET - otherwise */ + CALL_VC_CORE_FLAG_LANG_CHGD_UPDATE = 0x00000100, /**< SET - UI needs to be updated for language change, UNSET - otherwise */ + CALL_VC_CORE_FLAG_WAIT_SWITCH_FROM_BT = 0x00000200, /**< SET - Don't change path in path_change API, UNSET - change path according to current status */ + CALL_VC_CORE_FLAG_SETUPCALL_FAIL = 0x00000400, /**< SET - Setup call fail.(ex. Emergency call only). UNSET - Normal mo call.*/ + CALL_VC_CORE_FLAG_ACCEPT_BY_BT = 0x00000800, /**< SET - MT call accpeted by BT Headset, UNSET - MT call accept by Phone/ Call ended.*/ + CALL_VC_CORE_FLAG_QC_SIM_INSERTED = 0x00001000, /**< SET - Inserted SIM is QC Test SIM, UNSET - Inserted SIM is Normal SIM.*/ + CALL_VC_CORE_FLAG_MOCALL_END_BY_USER = 0x00002000, /**< SET - MO Call Ended by user, UNSET - MO Call not ended by user.*/ +} call_vc_core_flags_t; + +/** + * This enum defines the In Call Supplementary Services State + */ +typedef enum _call_vc_core_incall_ss_state_t { + CALL_VC_CORE_SS_NONE, /**< Idle State*/ + CALL_VC_CORE_SS_0, /**< Releases all held calls or Set UDUB for a waiting call*/ + CALL_VC_CORE_SS_1, /**< Releases all active calls and accepts the other(held or waiting) calls*/ + CALL_VC_CORE_SS_1X, /**< Releases a specific active call X*/ + CALL_VC_CORE_SS_2, /**< Places all active calls (if any exist) on hold and accepts the other(held or waiting)call*/ + CALL_VC_CORE_SS_2X, /**< Places all active calls on hold except call X with which communication shall be supported*/ + CALL_VC_CORE_SS_3, /**< Adds a held call to the conversation*/ + CALL_VC_CORE_SS_4, /**< ECT */ + CALL_VC_CORE_SS_USSD /**< USSD */ +} call_vc_core_incall_ss_state_t; + +/** +* This structure defines the details of the DTMF related data handled in document +*/ +typedef struct _voicecall_dtmf_info_t { + gboolean bdtmf_queue; /**< TRUE -dtmf queue enabled, FALSE - dtmf quue disabled */ + int dtmf_index; /**< index of the current dtmf digit sent */ + int dtmf_max_length; /**< maximum length of the dtmf number being sent */ + int dtmf_pause_timer; /**< Timer handle of the DTMF Pause Timer */ + gboolean bsat_dtmf; /**< SAT DTMF Type Engine Flag*/ + gboolean bsat_hidden; /**< SAT DTMF Hidden Engine Flag*/ + char dtmf_number[VC_PHONE_NUMBER_LENGTH_MAX]; +} voicecall_dtmf_info_t; + +/** + * This structure defines voicecall core info + */ +typedef struct _call_vc_core_state_t { + voicecall_setup_info_t call_setup_info; /**< Info of MO Call */ + voicecall_engine_t *pcall_engine; /**< Handle to Voicecall Engine */ + voicecall_snd_mgr_t *papp_snd; /**< Handle to Sound Manager */ + voicecall_dtmf_info_t dtmf_info; /**< DTMF Info*/ + + unsigned int core_status; /**< call core status */ + gboolean bt_connected; /**< TRUE - Bluetooth connected, FALSE - otherwise */ + gboolean bdtmf_queue; /**< TRUE -dtmf queue enabled, FALSE - dtmf quue disabled */ + int auto_redial_count; /** Auto Redial count **/ + unsigned int auto_answer_timer; /**< Timer Handle for Auto Answering */ + unsigned int callstatus_timer; /**< Timer Handle for callstatus set. */ + int selected_call_id_in_ss; /** +#include "vc-core-engine-types.h" + +#define VCALL_SENSOR_NEAR 1 +#define VCALL_SENSOR_FAR 2 + +/** + * Voicecall Engine API result values + */ +typedef enum _vcall_engine_api_result_t { + VCALL_ENGINE_API_FAILED = -1, + VCALL_ENGINE_API_SUCCESS, + + VCALL_ENGINE_API_ACTIVE_CALL_EXIST, + VCALL_ENGINE_API_ACTIVE_AND_HELD_CALL_EXIST, + + VCALL_ENGINE_API_CALLNOTALLOWED, + VCALL_ENGINE_API_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL, + VCALL_ENGINE_API_UNAVAILABLE, + VCALL_ENGINE_API_CHANGEOFFLINEMODETOCALL, + VCALL_ENGINE_API_CALLING_EMERG_ONLY, + VCALL_ENGINE_API_FDNCALLONLY, + VCALL_ENGINE_API_CALLFAILED, + VCALL_ENGINE_API_CALLENDED, + VCALL_ENGINE_API_SOS_CALL_ONLY_IN_NO_SIM_MODE, + VCALL_ENGINE_API_PHONE_NOT_INITIALISED, + VCALL_ENGINE_API_CAUSE_WRONG_NUMBER, + + VCALL_ENGINE_API_DTMFSENDING_FAIL, + VCALL_ENGINE_API_HOLD_FAILED, + VCALL_ENGINE_API_UNABLE_TO_RETRIEVE, + VCALL_ENGINE_API_SWAP_FAILED, + VCALL_ENGINE_API_SPLIT_FAILED, + VCALL_ENGINE_API_JOIN_FAILED, + VCALL_ENGINE_API_TRANSFER_FAILED, + VCALL_ENGINE_API_SWAP_NOT_SUPPORTED, + VCALL_ENGINE_API_HOLD_NOT_SUPPORTED, + VCALL_ENGINE_API_UNHOLD_NOT_SUPPORTED, + VCALL_ENGINE_API_JOIN_NOT_SUPPORTED, + VCALL_ENGINE_API_SPLIT_NOT_SUPPORTED, + VCALL_ENGINE_API_TRANSFER_NOT_SUPPORTED, + VCALL_ENGINE_API_INCOMPLETE, + + VCALL_ENGINE_API_NOT_ENOUGH_MEMORY_FOR_RECORDING, + VCALL_ENGINE_API_NO_CONNECTED_CALL_FOR_RECORDING, + + VCALL_ERROR_MAX +} vcall_engine_api_result_t; + +/** + * This enum defines call answer types + */ +typedef enum _vcall_engine_answer_type_t { + VCALL_ENGINE_ANSWER_HOLD_ACTIVE_AND_ACCEPT = 1, /**< Puts the active call on hold and accepts the call (Only CONNECTED will be sent to client) */ + VCALL_ENGINE_ANSWER_RELEASE_ACTIVE_AND_ACCEPT, /**< Releases the active call and accept the call (END and CONNECTED will be sent to Client) */ + VCALL_ENGINE_ANSWER_RELEASE_HOLD_AND_ACCEPT, /**< Releases the active call and accept the call (END and CONNECTED will be sent to client) */ + VCALL_ENGINE_ANSWER_RELEASE_ALL_AND_ACCEPT /**< Releases the all calls and accept the call (END and CONNECTED will be sent to client) */ +} vcall_engine_answer_type_t; + +/** + * This enum defines call release types + */ +typedef enum _vcall_engine_release_type_t { + VCALL_ENGINE_RELEASE_ALL_ACTIVE_CALLS, /**< To end all available active calls*/ + VCALL_ENGINE_RELEASE_ALL_HELD_CALLS, /**< To end all available held calls*/ + VCALL_ENGINE_RELEASE_ALL_CALLS, /**< To end all available calls(active,held,incoming/outgoing*/ +} vcall_engine_release_type_t; + +/** + * This enum defines call answer types + */ +typedef enum _vcall_engine_vol_type_t { + VCALL_ENGINE_VOL_TYPE_RINGTONE, /**< ringtone volume*/ + VCALL_ENGINE_VOL_TYPE_VOICE, /**< voice volume*/ + VCALL_ENGINE_VOL_TYPE_HEADSET /**< headset volume*/ +} vcall_engine_vol_type_t; + +/** +* This enumeration defines names of the on call audio status +*/ +typedef enum _vcall_engine_audio_type_t { + VCALL_ENGINE_AUDIO_NONE, /**< none*/ + VCALL_ENGINE_AUDIO_SPEAKER, /**< System LoudSpeaker Audio */ + VCALL_ENGINE_AUDIO_RECEIVER, /**< System receiver Audio */ + VCALL_ENGINE_AUDIO_HEADSET, /**< System Headset Audio */ + VCALL_ENGINE_AUDIO_EARJACK, /**< System Earjack Audio */ + VCALL_ENGINE_AUDIO_MAX, +} vcall_engine_audio_type_t; + +/** +* This enumeration defines names of lcd control +*/ +typedef enum _vcall_engine_lcd_control_t { + VCALL_ENGINE_LCD_OFF, /**< LCD Off*/ + VCALL_ENGINE_LCD_ON, /**< LCD On */ + VCALL_ENGINE_LCD_ON_LOCK, /**< LCD ON lock */ + VCALL_ENGINE_LCD_ON_UNLOCK, /**< LCD ON unlock */ + VCALL_ENGINE_LCD_MAX, +} vcall_engine_lcd_control_t; + +typedef enum { + VC_LCD_OFF = 1, + VC_LCD_ON, + VC_LCD_ON_LOCK, + VC_LCD_ON_UNLOCK, +} voicecall_lcd_control_t; + +/** + * This struct provides a structure for call setup info data. + */ +typedef struct _vcall_engine_setup_info_t { + int contact_index; + int storage_type; + int phone_type; + int bemergency; + char call_num[VC_PHONE_NUMBER_LENGTH_MAX]; + char call_name[VC_DISPLAY_NAME_LENGTH_MAX]; + char call_file_path[VC_IMAGE_PATH_LENGTH_MAX]; + char call_full_file_path[VC_IMAGE_PATH_LENGTH_MAX]; +} vcall_engine_setup_info_t; + +/** + * This struct provides a structure for sat setup call info data. + */ +typedef struct _vcall_engine_sat_setup_call_info_t { + int command_id; /***/ + char ring_tone[VC_RINGTONE_PATH_LENGTH_MAX]; /** +#include +#include +#include +#include +#include +#include +#include + +#define VOICE_CALL_SND_RINGTONE_PATH_LEN 256 /**DfQX`!q5>*0 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 O-;AMuu7&^8YyTHqOq#F& literal 0 HcmV?d00001 diff --git a/call-engine/sounds/03_Call_connect.wav b/call-engine/sounds/03_Call_connect.wav new file mode 100755 index 0000000000000000000000000000000000000000..22efdba902a3c986512bbfe5cc72ccae38828293 GIT binary patch literal 47944 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 literal 0 HcmV?d00001 diff --git a/call-engine/sounds/04_Call_disconnect.wav b/call-engine/sounds/04_Call_disconnect.wav new file mode 100755 index 0000000000000000000000000000000000000000..626ad401f0d119abd672289d78529e284cbd67a0 GIT binary patch literal 17004 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 B=mh`( literal 0 HcmV?d00001 diff --git a/call-engine/sounds/Call_RecordStart.wav b/call-engine/sounds/Call_RecordStart.wav new file mode 100755 index 0000000000000000000000000000000000000000..ee974ca0f3177bdf229779de2bf4a81ba66538de GIT binary patch literal 22768 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 BT */ +static char *gszbt_res_event[BT_AG_RES_CALL_SWAPPED + 1] = { + "BT_AG_RES_CALL_ORIG", + "BT_AG_RES_CALL_INCOM", + "BT_AG_RES_CALL_CONNECT", + "BT_AG_RES_CALL_END", + "BT_AG_RES_CALL_HOLD", + "BT_AG_RES_CALL_RETRIEVE", + "BT_AG_RES_CALL_JOINED", + "BT_AG_RES_SPK_GAIN", + "BT_AG_RES_MIC_GAIN", + "BT_AG_RES_CALL_REMOTE_RINGING", + "BT_AG_RES_SWITCH_TO_HEADSET", + "BT_AG_RES_SWITCH_TO_PHONE", + "BT_AG_RES_CALL_STATUS", + "BT_AG_RES_HEADSET_VOL", + "BT_AG_RES_CALL_SWAPPED" +}; + +/* CALL <-- BT */ +static char *gszbt_req_event[BT_AG_REQ_CALL_STATUS + 1] = { + "BT_AG_REQ_CONNECT", + "BT_AG_REQ_CONNECT_ERROR", + "BT_AG_REQ_DISCONNECT", + "BT_AG_REQ_SPK_GAIN", + "BT_AG_REQ_MIC_GAIN", + "BT_AG_REQ_CALL_ACCEPTED", + "BT_AG_REQ_CALL_REJECT", + "BT_AG_REQ_CALL_END", + "BT_AG_REQ_CALL_HOLD", + "BT_AG_REQ_CALL_RETRIEVE", + "BT_AG_REQ_BUTTON_PRESSED", + "BT_AG_REQ_CALL_REDIAL", + "BT_AG_REQ_CALL_2_SEND", + "BT_AG_REQ_CALL_3_SEND", + "BT_AG_REQ_CALL_0_SEND", + "BT_AG_REQ_CALL_1_SEND", + "BT_AG_REQ_HEADSET_VOL", + "BT_AG_REQ_SWITCH_TO_HEADSET", + "BT_AG_REQ_SWITCH_TO_PHONE", + "BT_AG_REQ_DTMF", + "BT_AG_REQ_CALL_STATUS" +}; + +#ifdef _NEW_SND_ +static gboolean b_user_rqst_path_change = FALSE; +#endif +static int __vc_bt_converted_bt_vol_to_voice_vol(int bt_vol_level); +static void __vc_bt_handle_connectivity_event(call_vc_core_state_t *pcall_core, gboolean bt_headset_connect_status); + +static int __vc_bt_converted_bt_vol_to_voice_vol(int bt_vol_level) +{ + int converted_vol_level = -1; + + if (bt_vol_level <= 0) { + converted_vol_level = 1; + } else if (bt_vol_level > 15) { + converted_vol_level = 15; + } else { + converted_vol_level = bt_vol_level; + } + return converted_vol_level; +} + +static void __vc_bt_handle_connectivity_event(call_vc_core_state_t *pcall_core, gboolean bt_headset_connect_status) +{ + VOICECALL_RETURN_IF_FAIL(pcall_core != NULL); + + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, "bt_headset_connect_status = %d \n", bt_headset_connect_status); + if (FALSE == bt_headset_connect_status) { + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_BT_EVENT_WAITING, FALSE); + } + + if (bt_headset_connect_status == pcall_core->bt_connected) { + CALL_ENG_DEBUG(ENG_DEBUG, "No change in state, Ignoring Event \n"); + CALL_ENG_DEBUG(ENG_DEBUG, "bt_headset_connect_status = %d \n", bt_headset_connect_status); + return; + } + pcall_core->bt_connected = bt_headset_connect_status; + + if (TRUE == pcall_core->bt_connected) { + /*Check the Call Status and Send Response event to the Bluetooth */ + int call_handle = -1; + + CALL_ENG_DEBUG(ENG_DEBUG, "BT connected, Not changing the sound status \n"); + /* Headset is connected, Set the Sound Status to Headset + and change the path only incase of mocall and connected call */ + + _vc_core_engine_status_get_call_handle_bytype(pcall_engine, VC_INCOMING_CALL, &call_handle); + if (call_handle != -1) { + call_vc_call_objectinfo_t callobject_info; + + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming Call Exists, call handle = %d \n", call_handle); + + voicecall_core_get_call_object(pcall_engine, call_handle, &callobject_info); + + /*Incoming Call Exists */ + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_INCOM, call_handle, callobject_info.tel_number); + return; + } + + _vc_core_engine_status_get_call_handle_bytype(pcall_engine, VC_OUTGOING_CALL, &call_handle); + if (call_handle != -1) { + int io_state = VC_INOUT_STATE_NONE; + + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing Call Exists, call handle = %d \n", call_handle); + _vc_core_engine_status_get_engine_iostate(pcall_engine, &io_state); + + switch (io_state) { + case VC_INOUT_STATE_OUTGOING_WAIT_ORIG: + case VC_INOUT_STATE_OUTGOING_WAIT_ALERT: /*Fall Through */ + { + call_vc_call_objectinfo_t callobject_info; + + voicecall_core_get_call_object(pcall_engine, call_handle, &callobject_info); + + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_ORIG, call_handle, callobject_info.tel_number); + } + break; + case VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED: + { + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_REMOTE_RINGING, call_handle, NULL); +#ifdef _NEW_SND_ + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_BT); + _vc_bt_request_switch_headset_path(pcall_core, TRUE); +#endif + } + break; + default: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Engine not in desired IO State, Current IO State: %d \n", io_state); + return; + } + break; + } + + return; + } + + _vc_core_engine_status_get_call_handle_bytype(pcall_engine, VC_CONNECTED_CALL, &call_handle); + if (call_handle != -1) { + CALL_ENG_DEBUG(ENG_DEBUG, "Connected Call Exists, call handle = %d \n", call_handle); + + CALL_ENG_DEBUG(ENG_DEBUG, "BT connected, Not changing the path in bt connect event\n"); + + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_CONNECT, call_handle, NULL); + } + + } else { + vc_engine_headset_status_type event_data; + +#ifdef _NEW_SND_ + if (voicecall_snd_get_path_status(pcall_core->papp_snd) == VOICE_CALL_SND_PATH_BT) { + if (_voicecall_dvc_get_earjack_connected() == TRUE) { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_EARJACK); + } else { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_RECEIVER); + } + + /* Headset is disconnected, so voice sound path should be changed to phone. */ + voicecall_snd_set_status(pcall_core->papp_snd, VOICE_CALL_AUDIO_HEADSET, FALSE); + if (voicecall_core_is_incoming_call_exists(pcall_engine)) { + if (pcall_core->papp_snd->bmute_play == TRUE) { + voicecall_snd_change_mm_path(pcall_core->papp_snd, VOICE_CALL_MM_MUTE_PLAY); + } else { + voicecall_snd_change_mm_path(pcall_core->papp_snd, VOICE_CALL_MM_RING_TONE); + } + } else { + if (voicecall_core_is_outgoing_call_exists(pcall_engine) || (voicecall_core_is_connected_call_exist(pcall_engine))) { + voicecall_snd_change_path(pcall_core->papp_snd); + } else { + CALL_ENG_DEBUG(ENG_ERR, "No valid calls, not changing the path \n"); + } + } + } else { + CALL_ENG_DEBUG(ENG_ERR, "BT disconnected when path is not on BT. Do NOT change path. only update UI"); + } + + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = FALSE; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_HEADSET_STATUS_TO_UI, (void *)&event_data); +#else + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = FALSE; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_HEADSET_STATUS_TO_UI, (void *)&event_data); + + /* Headset is disconnected, so voice sound path should be changed to phone. */ + voicecall_snd_set_status(pcall_core->papp_snd, VOICE_CALL_AUDIO_HEADSET, FALSE); + if (voicecall_core_is_incoming_call_exists(pcall_engine)) { + if (pcall_core->papp_snd->bmute_play == TRUE) { + voicecall_snd_change_mm_path(pcall_core->papp_snd, VOICE_CALL_MM_MUTE_PLAY); + } else { + voicecall_snd_change_mm_path(pcall_core->papp_snd, VOICE_CALL_MM_RING_TONE); + } + } else { + if (voicecall_core_is_outgoing_call_exists(pcall_engine) || (voicecall_core_is_connected_call_exist(pcall_engine))) { + voicecall_snd_change_path(pcall_core->papp_snd); + } else { + CALL_ENG_DEBUG(ENG_ERR, "No valid calls, not changing the path \n"); + } + } +#endif + } + +} + +gboolean _vc_bt_switch_headset_path(call_vc_core_state_t *pcall_core, gboolean bheadset, gboolean bsend_bt_response) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core != NULL); + + connectivity_bt_ag_res_t bt_event = BT_AG_RES_SWITCH_TO_PHONE; + voicecall_snd_mgr_t *papp_snd = pcall_core->papp_snd; + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, "bheadset = %d,bsend_bt_response = %d \n", bheadset, bsend_bt_response); + +#ifdef _NEW_SND_ + CALL_ENG_DEBUG(ENG_DEBUG, "b_user_rqst_path_change(%d)", b_user_rqst_path_change); + if (b_user_rqst_path_change == FALSE) { + if (TRUE == bheadset) { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_BT); + } + else { + int earjack_status = -1; + if (!vconf_get_int(VCONFKEY_SYSMAN_EARJACK, &earjack_status)) { + CALL_ENG_DEBUG(ENG_DEBUG, "earjack_status:[%d]\n", earjack_status); + if (earjack_status == VCONFKEY_SYSMAN_EARJACK_REMOVED) { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_RECEIVER); + } else { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_EARJACK); + } + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int fail"); + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_RECEIVER); + } + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Don't set path_status.. rqst from User. Already setted."); + } +#else + /*TODO Check whehter the follwing check and set status to be done inside if((TRUE == bconnected_call_exists) || (TRUE == bmo_call_exists)) */ + /*If Loud Speaker is ON, Change to Normal when Bluetooth Headset is switched ON */ + if ((TRUE == bheadset) && (TRUE == voicecall_snd_get_status(papp_snd, VOICE_CALL_AUDIO_SPEAKER))) { + voicecall_snd_set_status(papp_snd, VOICE_CALL_AUDIO_SPEAKER, FALSE); + } + voicecall_snd_set_status(papp_snd, VOICE_CALL_AUDIO_HEADSET, bheadset); +#endif + + /*Donot change the path for MT Call. Change the Audio Path only for MO and Connected calls */ + if ((TRUE == voicecall_core_is_connected_call_exist(pcall_engine)) || (TRUE == voicecall_core_is_outgoing_call_exists(pcall_engine))) { + CALL_ENG_DEBUG(ENG_DEBUG, "Changing the Path on BT Request \n"); + voicecall_snd_change_path_real(papp_snd); + + /*Send Response to BT only if the path is changed */ + if (TRUE == bsend_bt_response) { + bt_event = (TRUE == bheadset) ? BT_AG_RES_SWITCH_TO_HEADSET : BT_AG_RES_SWITCH_TO_PHONE; + CALL_ENG_DEBUG(ENG_DEBUG, "Sending BT Response bt_event: %d \n", bt_event); + _vc_bt_send_response_to_bt(pcall_core, bt_event, -1, NULL); + } + return TRUE; + } + + return FALSE; +} + +/** + * This function sends event to BT for switch to Headset/Phone + * + * @return void + * @param[in] pcall_core Handle to voicecall core + * @param[in] bheadset TRUE if sound type is Audio Headset, FALSE otherwise + */ +void _vc_bt_request_switch_headset_path(call_vc_core_state_t *pcall_core, gboolean bheadset) +{ + VOICECALL_RETURN_IF_FAIL(pcall_core != NULL); + + connectivity_bt_ag_res_t bt_event = BT_AG_RES_SWITCH_TO_PHONE; + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + + /*Donot change the path for MT Call. Change the Audio Path only for MO and Connected calls */ + if ((TRUE == voicecall_core_is_connected_call_exist(pcall_engine)) || (TRUE == voicecall_core_is_outgoing_call_exists(pcall_engine))) { + bt_event = (TRUE == bheadset) ? BT_AG_RES_SWITCH_TO_HEADSET : BT_AG_RES_SWITCH_TO_PHONE; + CALL_ENG_DEBUG(ENG_DEBUG, "Sending BT Response bt_event: %d \n", bt_event); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_BT_EVENT_WAITING, TRUE); + + _vc_bt_send_response_to_bt(pcall_core, bt_event, -1, NULL); + } else { + CALL_ENG_DEBUG(ENG_ERR, "No Valid calls to switch path \n"); + } +} + +/** + * This function handles the bluetooth notifications sent by blue tooth application + * + * @return TRUE -if event is handled, FALSE otherwise + * @param[in] pcall_core Handle to voicecall core + * @param[in] pbt_info bt notification details + */ +gboolean _vc_bt_handle_bt_events(call_vc_core_state_t *pcall_core, connectivity_bt_ag_param_info_t * pbt_info) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(pbt_info != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "Event: %s(%d) \n", gszbt_req_event[pbt_info->param1], pbt_info->param1); + + /*HS Connection not required for sending response to BT_AG_REQ_CALL_STATUS */ + if ((FALSE == pcall_core->bt_connected) && (BT_AG_REQ_CALL_STATUS != pbt_info->param1)) { + CALL_ENG_DEBUG(ENG_ERR, "BT not connected, Ignoring BT Events, BT Event= %d \n", pbt_info->param1); + return TRUE; + } + + switch (pbt_info->param1) { + case BT_AG_REQ_CALL_STATUS: + { + /*Send the Current Call status to BT */ + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_STATUS, -1, NULL); + + } + break; + case BT_AG_REQ_SPK_GAIN: + { + int bt_vol_level = pbt_info->param2; + int converted_vol_level; + vc_engine_vol_set_from_bt_type event_data; + + CALL_ENG_DEBUG(ENG_DEBUG, "Speaker Gain Value : %d\n", bt_vol_level); + +#ifdef _NEW_SND_ + if (voicecall_snd_get_path_status(pcall_core->papp_snd) != VOICE_CALL_SND_PATH_BT) { + CALL_ENG_DEBUG(ENG_DEBUG, "Headset not switched on, Ignoring Speaker Gain Event \n"); + return TRUE; + } +#else + if (FALSE == voicecall_snd_get_status(pcall_core->papp_snd, VOICE_CALL_AUDIO_HEADSET)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Headset not switched on, Ignoring Speaker Gain Event \n"); + return TRUE; + } +#endif + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_VOL_CHNGD_BYBT, TRUE); + + converted_vol_level = __vc_bt_converted_bt_vol_to_voice_vol(bt_vol_level); + + CALL_ENG_DEBUG(ENG_DEBUG, "converted Speaker Gain Value : %d\n", converted_vol_level); + + memset(&event_data, 0, sizeof(event_data)); + event_data.vol_level = converted_vol_level; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_SET_VOLUME_FROM_BT_TO_UI, (void *)&event_data); + } + break; + case BT_AG_REQ_CALL_ACCEPTED: + { + if (voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming call Accept by BT \n"); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT, TRUE); + if(_vc_core_util_phonelock_status() == FALSE) + vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_UNLOCK); +#ifdef _NEW_SND_ + voicecall_snd_set_path_status(pcall_core->papp_snd,VOICE_CALL_SND_PATH_BT); +#endif + if (TRUE == voicecall_core_answer_call(pcall_core, FALSE)) { + CALL_ENG_DEBUG(ENG_DEBUG, "voicecall_core_answer_call success \n"); + } + } else { + CALL_ENG_DEBUG(ENG_ERR, "No Incoming call, skipping BT request \n"); + } + } + break; + case BT_AG_REQ_CALL_REJECT: + { + if (TRUE == voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + if (FALSE == voicecall_core_reject_mt(pcall_core, TRUE)) { + CALL_ENG_DEBUG(ENG_ERR, "voicecall_core_reject_mt returned FALSE!\n"); + } + /*Call rejected, reset the accept by flag */ + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT, FALSE); + } else if (TRUE == voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine)) { + /*To retrieve the held call automatically once the mo call is ended, if held is call is available */ + _vc_core_engine_status_set_end_flag(pcall_core->pcall_engine, VC_RETREIVE_CALL_ON_MOCALL_END); + + voicecall_core_end_mo_call(pcall_core->pcall_engine); + } else { + CALL_ENG_DEBUG(ENG_ERR, "No Incoming/Outgoing calls, skipping BT request \n"); + } + } + break; + case BT_AG_REQ_BUTTON_PRESSED: + { + if (voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) { + return voicecall_core_process_hold_call(pcall_core); + } else { + CALL_ENG_DEBUG(ENG_ERR, "No connected calls, skipping BT request \n"); + } + + } + break; + case BT_AG_REQ_CALL_END: + { + voicecall_core_end_call(pcall_core); + } + break; + case BT_AG_REQ_CONNECT_ERROR: + { + /*To change path , reset flags and to update UI, if this is conisdered as Bt disconnect */ + __vc_bt_handle_connectivity_event(pcall_core, FALSE); + } + break; + case BT_AG_REQ_CALL_0_SEND: + { + if (TRUE == voicecall_core_is_any_call_exists(pcall_core->pcall_engine)) { + voicecall_core_start_incall_ss(pcall_core, CALL_VC_CORE_SS_0); + } + } + break; + case BT_AG_REQ_CALL_1_SEND: + { + if (TRUE == voicecall_core_is_any_call_exists(pcall_core->pcall_engine)) { + if (TRUE == voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming call Accept by BT \n"); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT, TRUE); + } + voicecall_core_start_incall_ss(pcall_core, CALL_VC_CORE_SS_1); + } + } + break; + case BT_AG_REQ_CALL_2_SEND: + { + if (TRUE == voicecall_core_is_any_call_exists(pcall_core->pcall_engine)) { + gboolean bactive_calls = FALSE; + gboolean bheld_calls = FALSE; + + if (TRUE == voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + voicecall_core_is_call_exists(pcall_core->pcall_engine, &bactive_calls, &bheld_calls); + if (!((TRUE == bactive_calls) && (TRUE == bheld_calls))) { + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming call Accept by BT \n"); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT, TRUE); + } + } + voicecall_core_start_incall_ss(pcall_core, CALL_VC_CORE_SS_2); + } + } + break; + case BT_AG_REQ_CALL_3_SEND: + { + if (TRUE == voicecall_core_is_any_call_exists(pcall_core->pcall_engine)) { + voicecall_core_start_incall_ss(pcall_core, CALL_VC_CORE_SS_3); + } + } + break; + case BT_AG_REQ_HEADSET_VOL: + { + int bt_vol_level = pbt_info->param2; + int converted_vol_level; + + CALL_ENG_DEBUG(ENG_DEBUG, "BT volume Level: %d \n", bt_vol_level); + + if (voicecall_core_is_any_call_exists(pcall_core->pcall_engine)) { + vc_engine_vol_resp_type event_data; + + converted_vol_level = __vc_bt_converted_bt_vol_to_voice_vol(bt_vol_level); + + memset(&event_data, 0, sizeof(event_data)); + event_data.vol_alert_type = VOICE_CALL_VOL_TYPE_HEADSET; + event_data.vol_level = converted_vol_level; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_GET_VOLUME_RESP_TO_UI, (void *)&event_data); + } else { + CALL_ENG_DEBUG(ENG_ERR, "NO Calls, Skipping BT Response \n"); + } + } + break; + case BT_AG_REQ_SWITCH_TO_HEADSET: + case BT_AG_REQ_SWITCH_TO_PHONE: + { + gboolean bswitch_to_headset = FALSE; + int bt_error = pbt_info->param2; + +#ifdef _NEW_SND_ + if(voicecall_core_get_status(pcall_core, CALL_VC_CORE_FLAG_BT_EVENT_WAITING) == TRUE) { + b_user_rqst_path_change = TRUE; + } else { + b_user_rqst_path_change = FALSE; + } +#endif + + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_BT_EVENT_WAITING, FALSE); + + /*Switch to response is received from BT, BT decision is fina, so reset the accept by BT */ + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT, FALSE); + + CALL_ENG_DEBUG(ENG_DEBUG, "BT Error :%d \n", bt_error); + if (0 == bt_error) { + /*Audio Connection/Disconnection Success case */ + bswitch_to_headset = (BT_AG_REQ_SWITCH_TO_HEADSET == pbt_info->param1) ? TRUE : FALSE; + } else { + /*Audio Connection/Disconnection Error Case */ + if (BT_AG_RES_AUDIO_CONNECTION_ERROR == bt_error) { + /*Connection Error, switch to phone */ + bswitch_to_headset = FALSE; + } else if (BT_AG_RES_AUDIO_DISCONNECTION_ERROR == bt_error) { + /*Disconnection Error, switch to headset */ + bswitch_to_headset = TRUE; + } else { + CALL_ENG_DEBUG(ENG_ERR, "Invalid BT Error: %d \n", bt_error); + } + + } + + CALL_ENG_DEBUG(ENG_DEBUG, "bswitch_to_headset = %d \n", bswitch_to_headset); + + if ((TRUE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) || (TRUE == voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine))) { + gboolean bupdate = FALSE; + + if (0 == bt_error) { + /*Connection/Diconnection is sucess, don't send response to BT */ + bupdate = _vc_bt_switch_headset_path(pcall_core, bswitch_to_headset, FALSE); + CALL_ENG_DEBUG(ENG_DEBUG, "bupdate = %d, bswitch_to_headset = %d \n", bupdate, bswitch_to_headset); + + vc_engine_headset_status_type event_data; + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = bswitch_to_headset; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_HEADSET_STATUS_TO_UI, (void *)&event_data); + } else { + /*Connection/Diconnection is NOT sucess, change path and send response to BT */ + bupdate = _vc_bt_switch_headset_path(pcall_core, bswitch_to_headset, TRUE); + } + + } else { + CALL_ENG_DEBUG(ENG_ERR, "No connected/outgoing calls, Skipping BT Request \n"); + } + } + break; + case BT_AG_REQ_DTMF: + { + gboolean active_calls = FALSE; + gboolean held_calls = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, "Send DTMF(%s)\n", pbt_info->param4); + if ((voicecall_core_is_call_exists(pcall_core->pcall_engine, &active_calls, &held_calls)) && (TRUE == active_calls)) { + voicecall_core_send_dtmf(pcall_core, pbt_info->param4); + } + } + break; + + case BT_AG_REQ_CALL_REDIAL: + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Action not defined for bt event: %d\n", pbt_info->param1); + return FALSE; + break; + + } + + return TRUE; +} + +/** + * This function sends response back to the bt application + * + * @return void + * @param[in] pcall_core Handle to voicecall core + * @param[in] bt_event bluetooth event type + * @param[in] param1 user param1 + * @param[in] param2 user param2 + */ +void _vc_bt_send_response_to_bt(call_vc_core_state_t *pcall_core, int bt_event, int param1, gpointer param2) +{ + VOICECALL_RETURN_IF_FAIL(pcall_core != NULL); + + connectivity_bt_ag_param_info_t bt_response_info; + CALL_ENG_DEBUG(ENG_DEBUG, "Event: %s(%d), param1=[%d] \n", gszbt_res_event[bt_event], bt_event, param1); + + /*Skip events, if Bluetooth is not connected */ +/* if((FALSE == pcall_core->bt_connected) && (BT_AG_RES_CALL_STATUS != bt_event)) + { + CALL_ENG_DEBUG(ENG_DEBUG,"Bluetooth not connected , Not sending any responses to BT\n"); + return; + } +*/ + /*Make BT Response Info */ + memset(&bt_response_info, 0, sizeof(connectivity_bt_ag_param_info_t)); + + bt_response_info.param1 = bt_event; + + switch (bt_event) { + case BT_AG_RES_CALL_STATUS: + case BT_AG_RES_CALL_SWAPPED: + { + connectivity_bt_ag_call_status_info_t call_status_info[10]; + int mt_call_handle = -1; + int mo_call_handle = -1; + int connected_call_handle = -1; + int active_group_member_num = 0; + int held_group_member_num = 0; + int index = 0; + int i = 0; + char temp_str[10] = { 0, }; + char result_str[256] = { 0, }; + + /*Incoming Call */ + _vc_core_engine_status_get_call_handle_bytype(pcall_core->pcall_engine, VC_INCOMING_CALL, &mt_call_handle); + if (mt_call_handle != -1) { + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming Call Exists, call handle = %d \n", mt_call_handle); + + call_status_info[index].call_id = mt_call_handle; + call_status_info[index].call_status = BT_AG_CALL_STATUS_INCOMING; + index++; + CALL_ENG_DEBUG(ENG_DEBUG, "total_call_member after mt= %d \n", index); + } + + /*Outgoing Call */ + _vc_core_engine_status_get_call_handle_bytype(pcall_core->pcall_engine, VC_OUTGOING_CALL, &mo_call_handle); + if (mo_call_handle != -1) { + voicecall_call_state_t call_state; + gboolean bvalid_call = TRUE; + + _vc_core_engine_status_get_call_state_byhandle(pcall_core->pcall_engine, mo_call_handle, &call_state); + CALL_ENG_DEBUG(ENG_DEBUG, "call state: %d \n", call_state); + + switch (call_state) { + case VC_CALL_STATE_OUTGOING_ALERT: + { + call_status_info[index].call_status = BT_AG_CALL_STATUS_ALERTING; + } + break; + case VC_CALL_STATE_PREPARE_OUTGOING: + case VC_CALL_STATE_OUTGOING: + case VC_CALL_STATE_OUTGOING_ORIG: + { + call_status_info[index].call_status = BT_AG_CALL_STATUS_DIALLING; + } + break; + default: /*All Other states , donot consider for mocall */ + CALL_ENG_DEBUG(ENG_DEBUG, "mo call state: %d \n", call_state); + bvalid_call = FALSE; + } + + if (TRUE == bvalid_call) { + call_status_info[index].call_id = mo_call_handle; + index++; + CALL_ENG_DEBUG(ENG_DEBUG, "total_call_member after mo= %d \n", index); + } + + } + + /*Connected call */ + int act_grp_index = -1; + int held_grp_index = -1; + + _vc_core_engine_group_get_group_indices(pcall_core->pcall_engine, &act_grp_index, &held_grp_index); + + CALL_ENG_DEBUG(ENG_DEBUG, "act_grp_index = %d, held_grp_index = %d\n", act_grp_index, held_grp_index); + /*Active Connected Call */ + if (act_grp_index != -1) { + _vc_core_engine_group_get_connected_member_count(pcall_core->pcall_engine, act_grp_index, &active_group_member_num); + CALL_ENG_DEBUG(ENG_DEBUG, "active_group_connected_member_num = %d \n", active_group_member_num); + for (i = 0; i < active_group_member_num; i++) { + _vc_core_engine_group_get_call_handle_byposition(pcall_core->pcall_engine, act_grp_index, i, &connected_call_handle); + if (connected_call_handle != -1) { + call_status_info[index].call_id = connected_call_handle; + call_status_info[index].call_status = BT_AG_CALL_STATUS_CONNECTED; + index++; + } + } + CALL_ENG_DEBUG(ENG_DEBUG, "total_call_member after active calls= %d \n", index); + } + + /*Held Connected Call */ + if (held_grp_index != -1) { + _vc_core_engine_group_get_connected_member_count(pcall_core->pcall_engine, held_grp_index, &held_group_member_num); + + CALL_ENG_DEBUG(ENG_DEBUG, "held_group_member_num = %d \n", held_group_member_num); + for (i = 0; i < held_group_member_num; i++) { + _vc_core_engine_group_get_call_handle_byposition(pcall_core->pcall_engine, held_grp_index, i, &connected_call_handle); + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle[%d] = %d \n", i, connected_call_handle); + if (connected_call_handle != -1) { + call_status_info[index].call_id = connected_call_handle; + call_status_info[index].call_status = BT_AG_CALL_STATUS_HELD; + index++; + } + } + CALL_ENG_DEBUG(ENG_DEBUG, "total_call_member after held calls= %d \n", index); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Total Calls = %d \n", index); + bt_response_info.param2 = index; + + memset(result_str, 0x00, sizeof(result_str)); + for (i = 0; i < index; i++) { + memset(temp_str, 0x00, sizeof(temp_str)); + snprintf(temp_str, sizeof(temp_str), "%d.%d/", call_status_info[i].call_id, call_status_info[i].call_status); + strncat(result_str, temp_str, sizeof(temp_str) - 1); + } + CALL_ENG_DEBUG(ENG_DEBUG, "The resultant string is %s\n", result_str); + + _vc_core_util_strcpy(bt_response_info.param4, sizeof(bt_response_info.param4), result_str); + + CALL_ENG_DEBUG(ENG_DEBUG, "Actual Data Passed is %s \n", bt_response_info.param4); + CALL_ENG_DEBUG(ENG_DEBUG, "Actual Data Passed to BT \n"); + for (i = 0; i < index; i++) { + CALL_ENG_DEBUG(ENG_DEBUG, "call id = %d \n", call_status_info[i].call_id); + CALL_ENG_DEBUG(ENG_DEBUG, "call status= %d \n", call_status_info[i].call_status); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Verification of BT data being sent\n"); + + } + break; + case BT_AG_RES_CALL_INCOM: + { + /*Length of Incoming Call Number */ + if (NULL != param2) { + CALL_ENG_DEBUG(ENG_DEBUG, "phone number=%s\n", (char *)param2); + bt_response_info.param2 = strlen(param2); + bt_response_info.param3 = param1; + _vc_core_util_strcpy(bt_response_info.param4, VC_PHONE_NUMBER_LENGTH_MAX, param2); + } + } + break; + case BT_AG_RES_CALL_ORIG: + { + if (NULL != param2) { + CALL_ENG_DEBUG(ENG_DEBUG, "phone number=%s\n", (char *)param2); +#ifdef _NEW_SND_ + switch (voicecall_snd_get_path_status(pcall_core->papp_snd)) { + case VOICE_CALL_SND_PATH_RECEIVER: + case VOICE_CALL_SND_PATH_SPEAKER: + case VOICE_CALL_SND_PATH_EARJACK: + bt_response_info.param2 = FALSE; + break; + case VOICE_CALL_SND_PATH_BT: + bt_response_info.param2 = TRUE; + break; + } +#else + bt_response_info.param2 = strlen(param2); +#endif + bt_response_info.param3 = param1; + _vc_core_util_strcpy(bt_response_info.param4, VC_PHONE_NUMBER_LENGTH_MAX, param2); + } + } + break; + case BT_AG_RES_CALL_REMOTE_RINGING: + { + /*Assign Call Handle */ + bt_response_info.param3 = param1; + } + break; + case BT_AG_RES_CALL_CONNECT: + case BT_AG_RES_CALL_END: + { +#ifdef _NEW_SND_ + switch (voicecall_snd_get_path_status(pcall_core->papp_snd)) { + case VOICE_CALL_SND_PATH_RECEIVER: + case VOICE_CALL_SND_PATH_SPEAKER: + case VOICE_CALL_SND_PATH_EARJACK: + bt_response_info.param2 = FALSE; + break; + case VOICE_CALL_SND_PATH_BT: + bt_response_info.param2 = TRUE; + break; + } +#endif + /*Assign Call Handle */ + bt_response_info.param3 = param1; + } + break; + case BT_AG_RES_SPK_GAIN: + /*BT Volume Level */ + bt_response_info.param2 = param1; + break; + case BT_AG_RES_HEADSET_VOL: /*Request For Current BT Volume Level */ + { + CALL_ENG_DEBUG(ENG_DEBUG, "Requesting for Current BT Volume Level \n"); + } + break; + case BT_AG_RES_SWITCH_TO_HEADSET: + case BT_AG_RES_SWITCH_TO_PHONE: + break; + case BT_AG_RES_CALL_HOLD: + case BT_AG_RES_CALL_RETRIEVE: /*Fall Through */ + bt_response_info.param3 = param1; + break; + case BT_AG_RES_CALL_JOINED: /*Fall Through */ + default: + break; + } + + vc_engine_on_dbus_send_response_to_bt(bt_response_info); + + CALL_ENG_DEBUG(ENG_DEBUG, "bt response ended.\n"); + +} + +/** + * This function register bt callback. + * + * @return TRUE if bt status is registered, FALSE otherwise + * @param[in] void + */ +gboolean _vc_bt_status_init(call_vc_core_state_t *pcall_core) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core != NULL); + + gboolean ret = FALSE; + + int bstatus = 0; + bstatus = _vc_bt_get_bt_status(); + CALL_ENG_DEBUG(ENG_DEBUG, "bt_connected:[%d]\n", bstatus); + __vc_bt_handle_connectivity_event(pcall_core, bstatus); + + ret = vconf_notify_key_changed(VCONFKEY_BT_DEVICE, (void *)_vc_bt_handle_phonestatus_bt_events, pcall_core); + if (0 != ret) { + CALL_ENG_DEBUG(ENG_ERR, "vconf_notify_key_changed failed..[%d]\n", ret); + return FALSE; + } + return TRUE; +} + +/** + * This function gets the blue tooth active status from the phone status server + * + * @return TRUE - if BT is enabled, FALSE otherwise + * @param[in] none + */ +gboolean _vc_bt_get_bt_status(void) +{ + int bt_status = VCONFKEY_BT_DEVICE_NONE; + gboolean ret = FALSE; + + ret = vconf_get_int(VCONFKEY_BT_DEVICE, &bt_status); + if (0 == ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bt_status = [0x%x] \n", bt_status); + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..[%d]\n", ret); + } + + return (VCONFKEY_BT_DEVICE_HEADSET_CONNECTED == (bt_status & VCONFKEY_BT_DEVICE_HEADSET_CONNECTED)) ? TRUE : FALSE; +} + +/** + * This function gets the BT inband ringtone activate settings + * + * @return TRUE - if BT inband ringtone activate settings is ON, FALSE otherwise + * @param[in] none + */ +gboolean _vc_bt_get_inband_ringtone_active(void) +{ + /* InBand_Ringtone_Active for vconf.. */ + return FALSE; +} + +/** + * This function handles the notifications sent by phone status server + * + * @return TRUE -if notification is handled, FALSE otherwise + * @param[in] pcall_core Handle to voicecall core + * @param[in] bt_status Blue tooth status + */ +gboolean _vc_bt_handle_phonestatus_bt_events(keynode_t *node, call_vc_core_state_t *pcall_core) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(node != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core != NULL); + + gboolean bt_conn_status = FALSE; + int bt_status = vconf_keynode_get_int(node); + + CALL_ENG_DEBUG(ENG_DEBUG, "bt_status = [0x%x] \n", bt_status); + + /*set the sound status */ + bt_conn_status = (VCONFKEY_BT_DEVICE_HEADSET_CONNECTED == (bt_status & VCONFKEY_BT_DEVICE_HEADSET_CONNECTED)) ? TRUE : FALSE; + CALL_ENG_DEBUG(ENG_DEBUG, "bt_conn_status = %d\n", bt_conn_status); + + __vc_bt_handle_connectivity_event(pcall_core, bt_conn_status); + return TRUE; +} + +/** + * This function retreives volume level of headset + * + * @return + * @param[in] pcall_core Handle to voicecall core + */ +void _vc_bt_get_headset_volume(call_vc_core_state_t *pcall_core) +{ + VOICECALL_RETURN_IF_FAIL(pcall_core != NULL); + + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_HEADSET_VOL, 0, NULL); +} + +/** + * This function returns the BT connection status + * + * @return TRUE if bt is connected, FALSE otherwise + * @param[in] pcall_core Handle to voicecall core + */ +gboolean _vc_bt_is_bt_connected(call_vc_core_state_t *pcall_core) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core != NULL); + + return pcall_core->bt_connected; +} + +/** + * This function returns the BT SCO status.(Synchronized Connection Oriented link) + * + * @return TRUE if bt is connected, FALSE otherwise + * @param[in] void + */ +gboolean _vc_bt_get_bt_sco_status(void) +{ + gboolean sco_status = FALSE; + gboolean ret = FALSE; + + ret = vconf_get_bool(VCONFKEY_BT_HEADSET_SCO, &sco_status); + if (0 == ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "sco_status = [%d] \n", sco_status); + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..[%d]\n", ret); + } + + return sco_status; +} + +/** + * This function processed bt handset event + * + * @return TRUE if bt is connected, FALSE otherwise + * @param[in] pcall_core Handle to voicecall core + * @param[in] bheadset headset status + */ +gboolean _vc_bt_process_bt_handset(call_vc_core_state_t *pcall_core, int bheadset) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "bheadset:[%d] \n", bheadset); + if (bheadset) { + if (FALSE == _vc_bt_get_bt_status()) { + vc_engine_on_dbus_send_connect_to_bt(); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "BT is ON.. switch path to BT"); + _vc_bt_switch_headset_path(pcall_core, bheadset, TRUE); + } + } else { + _vc_bt_switch_headset_path(pcall_core, bheadset, TRUE); + } + return TRUE; +} diff --git a/call-engine/voice-call-core.c b/call-engine/voice-call-core.c new file mode 100755 index 0000000..da160a7 --- /dev/null +++ b/call-engine/voice-call-core.c @@ -0,0 +1,3678 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vc-core-util.h" +#include "vc-core-engine-types.h" +#include "vc-core-callagent.h" +#include "vc-core-engine.h" +#include "vc-core-error.h" +#include "voice-call-core.h" +#include "voice-call-dbus.h" +#include "voice-call-engine-msg.h" +#include "voice-call-service.h" + +#include "voice-call-bt.h" +#include "vc-core-engine.h" + +#include "voice-call-engine.h" + +#define MO_REDIAL_COUNT_MAX 10 +#define MO_REDIAL_TIMER_INTERVAL_FIRST 3000 /**< MO Redial Timer Interva; - 5 Secs*/ +#define MO_REDIAL_TIMER_INTERVAL_SECOND 3000 /**< MO Redial Timer Interva; - 1 Minute*/ +#define MO_REDIAL_TIMER_INTERVAL_THIRD 3000 /**< MO Redial Timer Interva; - 3 Minutes*/ + +#define MINUTE_MINDER_TIMEOUT_VALUE 60000 + +#define DTMF_PAUSE_TIMER_INTERVAL_FIRST 3000 /*3 Seconds */ +#define DTMF_PAUSE_TIMER_INTERVAL_REST 3000 /*3 Seconds */ +#define DTMF_PAUSE_TIMER_INTERVAL_GCF_FIRST 800 /*0.8 Second */ +#define DTMF_PAUSE_TIMER_INTERVAL_GCF_REST 3300 /*3 Seconds */ + +gboolean mo_redial_timer_cb(void *data); + +#define SET_PATH_TIMER_VALUE 50 +static guint g_set_path_timer_handler = 0; +static gboolean __voicecall_core_set_path_timer_cb(gpointer puser_data); + +/* For Debug Information, Call Engine Event name string constant */ +char *gszcall_engine_event[VC_ENGINE_EVENT_MAX] = { + "VC_CALL_INCOM", + "VC_CALL_OUTGOING", + "VC_CALL_OUTGOING_ORIG", + "VC_CALL_OUTGOING_ALERT", + "VC_CALL_CONNECTED", + "VC_CALL_NORMAL_END", + "VC_CALL_INCOM_END", + "VC_CALL_INCOM_DROPPED", + "VC_CALL_REJECTED_END", + "VC_CALL_OUTGOING_END", /* 10 */ + + "VC_CALL_OUTGOING_ABORTED", + "VC_CALL_DTMF_ACK", + "VC_CALL_AUTO_REDIAL_CHECK", + "VC_CALL_ANSWER_CNF", + "VC_CALL_SS_HELD", + "VC_CALL_SS_RETREIVED", + "VC_CALL_SS_SWAP", + "VC_CALL_SS_SETUP_CONF", + "VC_CALL_SS_SPLIT_CONF", + "VC_CALL_SS_TRANSFERRED", /* 20 */ + + "VC_CALL_SS_CONNECT_LINE_IND", + "VC_CALL_IND_FORWARD", + "VC_CALL_IND_ACTIVATE", + "VC_CALL_IND_HOLD", + "VC_CALL_IND_TRANSFER", + "VC_CALL_IND_SETUPCONFERENCE", + "VC_CALL_IND_BARRING", + "VC_CALL_IND_WAITING", + "VC_CALL_IND_CUGINFO", + "VC_CALL_IND_SSNOTIFY", /* 30 */ + + "VC_CALL_IND_CALLINGNAMEINFO", + "VC_CALL_IND_REDIRECT_CNF", + "VC_CALL_IND_ACTIVATECCBS_CNF", + "VC_CALL_IND_ACTIVATECCBS_USERINFO", + "VC_CALL_IND_AOC", + "VC_ERROR_OCCURED", + "VC_ACTION_INCOM_FORCE", + "VC_ACTION_SAT_REQUEST", + "VC_ACTION_SAT_RESPONSE", + "VC_ACTION_CALL_END_HELD_RETREIVED", /* 40 */ + + "VC_ACTION_NO_ACTIVE_TASK", + "VC_CALL_GET_VOLUME_RESP" +}; + +static void __voicecall_core_check_headset_earjack_status(call_vc_core_state_t *pcall_core); +static void __vc_core_set_auto_redial_count(call_vc_core_state_t *pcall_core, int auto_redial_count); +static gboolean __voicecall_core_callstatus_set_timer_cb(gpointer puser_data); + +static int __voicecall_core_get_string_id_by_errorcode(int error_code); +static void __voicecall_core_mocall_reset_engine_state(voicecall_engine_t *pcall_engine); +static gboolean __voicecall_core_is_redial_cuase(int end_cause); + +#ifdef PDIAL_SEND_DTMF +static gboolean __voicecall_core_queue_dtmf_string(call_vc_core_state_t *pcall_core, char *dtmf_string, gboolean bsat_dtmf); +static gboolean __voicecall_core_handle_dtmf_ack(call_vc_core_state_t *pcall_core, gboolean success); +#endif + +/** + * This function puts the currently active call on hold + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + */ +inline gboolean voicecall_core_hold_call(voicecall_engine_t *pcall_engine) +{ + + voicecall_error_t error_code = ERROR_VOICECALL_NONE; + + PRINT_CURRENT_TIME("Call Hold Start at"); + error_code = _vc_core_engine_hold_call(pcall_engine); + + CALL_ENG_DEBUG(ENG_DEBUG, "Error Code : %d", error_code); + return (ERROR_VOICECALL_NONE == error_code || ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS == error_code) ? TRUE : FALSE; +} + +/** + * This function retreives the currently held call + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + */ +inline gboolean voicecall_core_retrieve_call(voicecall_engine_t *pcall_engine) +{ + voicecall_error_t error_code = ERROR_VOICECALL_NONE; + + PRINT_CURRENT_TIME("Call Retrieve Start at"); + error_code = _vc_core_engine_retrieve_call(pcall_engine); + + CALL_ENG_DEBUG(ENG_DEBUG, "Error Code : %d", error_code); + return (ERROR_VOICECALL_NONE == error_code || ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS == error_code) ? TRUE : FALSE; +} + +/** + * This function swaps the currently available active and held calls + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + */ +inline gboolean voicecall_core_swap_calls(voicecall_engine_t *pcall_engine) +{ + voicecall_error_t error_code = ERROR_VOICECALL_NONE; + + PRINT_CURRENT_TIME("Call Swap Start at"); + error_code = _vc_core_engine_swap_calls(pcall_engine); + + CALL_ENG_DEBUG(ENG_DEBUG, "Error Code : %d", error_code); + return (ERROR_VOICECALL_NONE == error_code || ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS == error_code) ? TRUE : FALSE; +} + +/** + * This function clears the MO Call Details + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + */ +inline gboolean voicecall_core_clear_mo_call(voicecall_engine_t *pcall_engine) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_finalize_call(pcall_engine, VC_OUTGOING_CALL, -1)) ? TRUE : FALSE; +} + +/** + * This function clears the Connected Call Details + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + * @param[in] call_handle Handle of the Connected Call to be cleared + */ +inline gboolean voicecall_core_clear_connected_call(voicecall_engine_t *pcall_engine, int call_handle) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_finalize_call(pcall_engine, VC_CONNECTED_CALL, call_handle)) ? TRUE : FALSE; +} + +/** + * This function changes the voicecall engine's state + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + * @param[in] eng_state Engine State to be changed + */ +inline gboolean voicecall_core_change_engine_state(voicecall_engine_t *pcall_engine, int eng_state) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_change_engine_iostate(pcall_engine, eng_state)) ? TRUE : FALSE; +} + +/** + * This function ends an Outgoing Call + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + */ +inline gboolean voicecall_core_end_mo_call(voicecall_engine_t *pcall_engine) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_end_call(pcall_engine, VC_END_OUTGOING_CALL)) ? TRUE : FALSE; +} + +/** + * This function retreives the Voicecall Engine's State + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + * @param[out] io_state Voicecall Engine InOut State + */ +inline gboolean voicecall_core_get_engine_state(voicecall_engine_t *pcall_engine, int *eng_state) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_status_get_engine_iostate(pcall_engine, eng_state)) ? TRUE : FALSE; +} + +/** + * This function checks whether any call exists + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + * @param[out] active_calls TRUE - If active call exists or FALSE If active call doesn't exists + * @param[out] held_calls TRUE - If held call exists or FALSE If held call doesn't exists + */ +inline gboolean voicecall_core_is_call_exists(voicecall_engine_t *pcall_engine, gboolean * active_calls, gboolean * held_calls) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_status_isexists_any_call(pcall_engine, active_calls, held_calls)) ? TRUE : FALSE; +} + +/** + * This function checks whether incoming call exists or not + * + * @return Returns TRUE if incoming call exists or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + */ +inline gboolean voicecall_core_is_incoming_call_exists(voicecall_engine_t *pcall_engine) +{ + gboolean bmtcall_exists = FALSE; + + _vc_core_engine_status_isexists_call_bytype(pcall_engine, VC_INCOMING_CALL, &bmtcall_exists); + return bmtcall_exists; +} + +/** + * This function checks whether outgoing call exists or not + * + * @return Returns TRUE if outgoing call exists or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + */ +inline gboolean voicecall_core_is_outgoing_call_exists(voicecall_engine_t *pcall_engine) +{ + gboolean bmocall_exists = FALSE; + + _vc_core_engine_status_isexists_call_bytype(pcall_engine, VC_OUTGOING_CALL, &bmocall_exists); + return bmocall_exists; +} + +/** + * This function checks whether any connexcted call exists or not + * + * @return Returns TRUE if connected call exists or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + */ +inline gboolean voicecall_core_is_connected_call_exist(voicecall_engine_t *pcall_engine) +{ + gboolean bcall_exists = FALSE; + + _vc_core_engine_status_isexists_call_bytype(pcall_engine, VC_CONNECTED_CALL, &bcall_exists); + return bcall_exists; +} + +/** + * This function checks whether any connexcted call exists or not in the given group + * + * @return Returns TRUE if connected call exists or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + * @param[in] group_index Group Index to be searhced + */ +inline gboolean voicecall_core_is_connected_call_exist_in_group(voicecall_engine_t *pcall_engine, int group_index) +{ + gboolean bcall_exists = FALSE; + voicecall_error_t error_code = ERROR_VOICECALL_NONE; + + if (ERROR_VOICECALL_NONE != _vc_core_engine_group_isexists_connected_call_ingroup(pcall_engine, group_index, &bcall_exists)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Error_code %d", error_code); + + } + + return bcall_exists; +} + +/** + * This function checks whether any call exists + * + * @return Returns TRUE if connected call exists or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + */ +inline gboolean voicecall_core_is_any_call_exists(voicecall_engine_t *pcall_engine) +{ + gboolean bcall_exists = FALSE; + + _vc_core_engine_status_isexists_call_bytype(pcall_engine, VC_INCOMING_CALL, &bcall_exists); + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming Call = [%d]", bcall_exists); + + if (FALSE == bcall_exists) { + _vc_core_engine_status_isexists_call_bytype(pcall_engine, VC_OUTGOING_CALL, &bcall_exists); + } + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing Call = [%d]", bcall_exists); + + if (FALSE == bcall_exists) { + _vc_core_engine_status_isexists_call_bytype(pcall_engine, VC_CONNECTED_CALL, &bcall_exists); + } + CALL_ENG_DEBUG(ENG_DEBUG, "Connected Call = [%d]", bcall_exists); + + return bcall_exists; +} + +/** + * This function retreives the totally number of availavle calls including connected, MO and MT Calls + * + * @return Returns TRUE if success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + * @param[out] ptotal_call_member number of avialble calls + */ +inline gboolean voicecall_core_get_total_call_member(voicecall_engine_t *pcall_engine, int *ptotal_call_member) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_status_get_call_member_count(pcall_engine, ptotal_call_member)) ? TRUE : FALSE; +} + +/** + * This function checks whether voicecall engine's call agent is idle or not + * + * @return Returns TRUE if call agent is idle or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + */ +inline gboolean voicecall_core_is_callagent_idle(voicecall_engine_t *pcall_engine) +{ + gboolean bcallagent_idle = FALSE; + + _vc_core_engine_status_is_engine_busy(pcall_engine, &bcallagent_idle); + CALL_ENG_DEBUG(ENG_DEBUG, "Call Agent Busy State : %d", bcallagent_idle); + + return !bcallagent_idle; +} + +/** +* This function checks the current call status and engine status +* +* @return TRUE, if connected calls available and engine is in idle, FALSE otherwise + * @param[in] pcall_engine Handle to voicecall engine +*/ +inline gboolean voicecall_core_is_incall_request_possible(voicecall_engine_t *pcall_engine) +{ + int eng_state = VC_INOUT_STATE_NONE; + int member_num_0 = 0; + int member_num_1 = 0; + + _vc_core_engine_group_get_connected_member_count(pcall_engine, 0, &member_num_0); + _vc_core_engine_group_get_connected_member_count(pcall_engine, 1, &member_num_1); + voicecall_core_get_engine_state(pcall_engine, &eng_state); + if (!(voicecall_core_is_callagent_idle(pcall_engine) && ((member_num_1 + member_num_0) > 0) + && (eng_state == VC_INOUT_STATE_NONE))) { + CALL_ENG_DEBUG(ENG_DEBUG, "Engine Busy, Cannot complete Request,mem_0:%d,mem_1:%d,eng_state:%d ", member_num_0, member_num_1, eng_state); + return FALSE; + } + + return TRUE; +} + +/** + * This function changes the modem call audio path + * + * @return TRUE sucess, FALSE otherwise + * @param[in] pcall_engine Handle to voicecall engine + * @param[in] audio_path audio path to be changed + */ +inline gboolean voicecall_core_change_audio_path(voicecall_engine_t *pcall_engine, voicecall_audio_path_t audio_path) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_change_audio_path(pcall_engine, audio_path)) ? TRUE : FALSE; +} + +/** + * This function sets the voice call audio volume for the given audio path type + * + * @return returns TRUE in success , FALSE otherwise + * @param[in] pcall_engine Handle to voicecall engine + * @param[in] tapi_snd_path audio path for the volume to be set + * @param[in] vol_level volume level + */ +inline gboolean voicecall_core_set_audio_volume(voicecall_engine_t *pcall_engine, voicecall_audio_path_t tapi_snd_path, int vol_level) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_set_audio_volume(pcall_engine, tapi_snd_path, (voicecall_audio_volume_t) vol_level)) ? TRUE : FALSE; +} + +/** + * This function retreives the voice call audio volume for the given audio path type + * + * @return returns TRUE in success , FALSE otherwise + * @param[in] pcall_engine Handle to voicecall engine + * @param[in] audio_path_type audio path for the volume to be retreived + */ +inline gboolean voicecall_core_get_audio_volume(voicecall_engine_t *pcall_engine, voicecall_audio_path_t audio_path_type) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_get_audio_volume(pcall_engine, audio_path_type)) ? TRUE : FALSE; +} + +/** + * This function set the voice call audio mute status + * + * @return returns TRUE in success , FALSE otherwise + * @param[in] pcall_engine Handle to voicecall engine + * @param[in] bvoice_mute mute status + */ +inline gboolean voicecall_core_set_audio_mute_status(voicecall_engine_t *pcall_engine, gboolean bvoice_mute) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_set_audio_mute(pcall_engine, bvoice_mute)) ? TRUE : FALSE; +} + +/** + * This function retreives the first active call among the available active calls + * + * @return Returns TRUE if success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + * @param[out] pcall_handle call handle of the active call + */ +inline gboolean voicecall_core_get_zuhause(voicecall_engine_t *pcall_engine, gboolean * bzuhause) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_status_is_zuhause_area(pcall_engine, bzuhause)) ? TRUE : FALSE; +} + +/** + * This function retreives the Voicecall Engine's State + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + * @param[in] call_handle Call handle of the call for which the call object is retrieved + * @param[out] pcall_object Pointer to the retrived call object info + */ +inline gboolean voicecall_core_get_call_object(voicecall_engine_t *pcall_engine, int call_handle, call_vc_call_objectinfo_t * pcall_object) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_status_get_call_object(pcall_engine, call_handle, pcall_object)) ? TRUE : FALSE; +} + +/** + * This function sends response to sat engine + * + * @return Returns TRUE If transfer call can be made or FALSE if not + * @param[in] pcall_engine Handle to voicecall engine + * @param[in] sat_rqst_resp_type sat rqst/resp type to be set by the client + * @param[in] sat_response_type sat response type to be sent to sat + */ +inline gboolean voicecall_core_send_sat_response(voicecall_engine_t *pcall_engine, voicecall_engine_sat_rqst_resp_type sat_rqst_resp_type, call_vc_sat_reponse_type_t sat_response_type) +{ + voicecall_error_t error_code = 0; + error_code = _vc_core_engine_send_sat_response(pcall_engine, sat_rqst_resp_type, sat_response_type); + CALL_ENG_DEBUG(ENG_DEBUG, "error_code:[%d] ", error_code); + return (ERROR_VOICECALL_NONE == error_code) ? TRUE : FALSE; +} + +/** + * This function retreives the number of active call members + * + * @return Returns TRUE if success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[out] pactive_member_num number of active call members available + */ +inline gboolean voicecall_core_get_active_call_member(call_vc_core_state_t *pcall_core, int *pactive_member_num) +{ + *pactive_member_num = 0; + return (ERROR_VOICECALL_NONE == _vc_core_engine_status_get_call_member_info(pcall_core->pcall_engine, VC_ACTIVE_CALL, pactive_member_num)) ? TRUE : FALSE; +} + +/** + * This function checks whether possible to make conference call + * + * @return Returns TRUE If Conference call can be made or FALSE if not + * @param[in] papp_document Handle to Application Document + */ +inline gboolean voicecall_core_is_conf_call_possible(call_vc_core_state_t *pcall_core) +{ + gboolean bconf_call = FALSE; + + _vc_core_engine_status_is_conf_call_possible(pcall_core->pcall_engine, &bconf_call); + + return bconf_call; +} + +/** + * This function checks whether possible to transfer call + * + * @return Returns TRUE If transfer call can be made or FALSE if not + * @param[in] pcall_core Handle to voicecall core + */ +inline gboolean voicecall_core_is_transfer_call_possible(call_vc_core_state_t *pcall_core) +{ + gboolean btransfer_call = FALSE; + + _vc_core_engine_status_is_transfer_call_possible(pcall_core->pcall_engine, &btransfer_call); + + return btransfer_call; +} + +/** + * This function checks whether the given code is a valid Supplementary Services Code + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] pszInput Number to be verified + */ +inline gboolean voicecall_core_is_valid_sscode(call_vc_core_state_t *pcall_core, const char *pszInput) +{ + gboolean bsscode = FALSE; + + _vc_core_engine_status_isvalid_ss_code(pcall_core->pcall_engine, pszInput, &bsscode); + + return bsscode; +} + +#ifdef _CPHS_DEFINED_ +/** + * This function gets the cphs status from the engine + * + * @return TRUE if queried status is enabled, FALSE otherwise + * @param[in] pcall_core Handle to voicecall core + * @param[in] csp_service csp service to be queried + */ +inline gboolean voicecall_core_get_cphs_csp_status(call_vc_core_state_t *pcall_core, voicecall_cphs_csp_service csp_service) +{ + gboolean bcsp_status = FALSE; + + _vc_core_engine_status_get_cphs_csp_status(pcall_core->pcall_engine, csp_service, &bcsp_status); + return bcsp_status; +} +#endif + +/** + * This function informs the Voicecall Engine that current SS operation has been completed + * + * @return Returns TRUE if all the calls are ended or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + */ +inline gboolean voicecall_core_set_check_ss_on_end(call_vc_core_state_t *pcall_core) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_status_set_end_flag(pcall_core->pcall_engine, VC_RETREIVE_CALL_ON_MOCALL_END)) ? TRUE : FALSE; +} + +/** + * This function extracts vaild phone number + * + * @return void + * @param[in] + */ +inline void voicecall_core_extract_phone_number(const char *source_tel_number, char *phone_number, const int buf_size) +{ + _vc_core_engine_extract_phone_number(source_tel_number, phone_number, buf_size); +} + +/************************ +* inline function END +**************************/ +void voicecall_core_set_status(call_vc_core_state_t *pcall_core, call_vc_core_flags_t core_flags, gboolean bstatus) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "core flags:[0x%x], Set status:[%d] ", core_flags, bstatus); + + if (CALL_VC_CORE_FLAG_NONE == core_flags) { + /*Set the document flag to defaults */ + pcall_core->core_status = CALL_VC_CORE_FLAG_NONE; + return; + } + + if (TRUE == bstatus) { + /*Set Flag */ + pcall_core->core_status |= core_flags; + } else { + /*Remove bit field only if it is already set/ otherwise ignore it */ + if ((pcall_core->core_status & core_flags) == core_flags) { + pcall_core->core_status = (pcall_core->core_status ^ core_flags); + } + } + + CALL_ENG_DEBUG(ENG_DEBUG, "After SET, core_status:[0x%x]", pcall_core->core_status); + +} + +gboolean voicecall_core_get_status(call_vc_core_state_t *pcall_core, call_vc_core_flags_t core_flags) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "core_flags:[0x%x]", core_flags); + CALL_ENG_DEBUG(ENG_DEBUG, "Before Get, core_status:[0x%x]", pcall_core->core_status); + + if ((pcall_core->core_status & core_flags) == core_flags) { + CALL_ENG_DEBUG(ENG_DEBUG, "Flag [0x%x] is available", core_flags); + return TRUE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Flag [0x%x] is not available", core_flags); + return FALSE; +} + +#ifdef VC_ENG_FDN_SUPPORT +gboolean voicecall_core_check_fdn_status(call_vc_core_state_t *pcall_core) +{ + gboolean bfdn_enabled = FALSE; + + /*Check the FDN Status of the number with the contact */ + _vc_core_engine_status_isenabled_fdn(pcall_core->pcall_engine, &bfdn_enabled); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_FDN_SVC_ENABLED, bfdn_enabled); + + if (TRUE == bfdn_enabled) { + gboolean bct_exists = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, "FDN mode enabled.."); + if (!bct_exists) { + vc_engine_msg_box_type event_data; + memset(&event_data, 0, sizeof(event_data)); + + CALL_ENG_DEBUG(ENG_DEBUG, "FDN only..."); + _vc_core_engine_finalize_call(pcall_core->pcall_engine, VC_OUTGOING_CALL, -1); + + event_data.string_id = IDS_CALL_POP_FDNCALLONLY; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + return FALSE; + } + + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "FDN mode disabled.."); + } + + return TRUE; +} +#endif + +static gboolean __voicecall_core_minute_minder(gpointer puser_data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)puser_data; + + if ((voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine) == FALSE) + && (voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine) == FALSE) + && (voicecall_core_is_connected_call_exist(pcall_core->pcall_engine) == TRUE)) { + voicecall_snd_play_effect_tone(pcall_core->papp_snd, VOICE_CALL_SND_EFFECT_CALL_MINUTE_MINDER); + } + + return TRUE; +} + +static gboolean __voicecall_core_set_path_timer_cb(gpointer puser_data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + VOICECALL_RETURN_FALSE_IF_FAIL(puser_data != NULL); + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)puser_data; + + voicecall_snd_change_path(pcall_core->papp_snd); + + if (g_set_path_timer_handler > 0) { + g_source_remove(g_set_path_timer_handler); + g_set_path_timer_handler = 0; + } + + return FALSE; +} + +static gboolean __voicecall_core_handle_call_end_on_silent_reject(call_vc_core_state_t *pcall_core, int call_handle) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle = %d", call_handle); + + if ((pcall_core->mtcall_silent_reject_handle == call_handle)) { + if (FALSE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) { + /*Connected calls need to be checked, Connected emergency calls may be avaialble */ + voicecall_snd_change_mm_path(pcall_core->papp_snd, VOICE_CALL_MM_RESET); + voicecall_core_set_to_default(pcall_core); + } else { + CALL_ENG_DEBUG(ENG_ERR, "Connected calls available"); + _vc_core_engine_status_dump_call_details(pcall_core->pcall_engine); + } + pcall_core->mtcall_silent_reject_handle = -1; + return TRUE; + } + + return FALSE; +} + +static gboolean __voicecall_core_silent_reject_mt(call_vc_core_state_t *pcall_core, int call_handle) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle = %d", call_handle); + + voicecall_error_t error_code = ERROR_VOICECALL_NONE; + + pcall_core->mtcall_silent_reject_handle = call_handle; + + /*Reject the call */ + error_code = _vc_core_engine_reject_call(pcall_core->pcall_engine, FALSE); + + if (ERROR_VOICECALL_NONE != error_code) { + CALL_ENG_DEBUG(ENG_ERR, "_vc_core_engine_reject_call Failed, error_code = %d", error_code); + } + + return TRUE; +} + +static void __voicecall_core_processing_mo_cancel(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + int total_call_member; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + if (TRUE == voicecall_snd_is_signal_playing(pcall_core->papp_snd)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Signal is playing, skipping cancel timer"); + return; + } + + vc_engine_outgoing_end_type event_data; + + /* normal outgong end */ + CALL_ENG_DEBUG(ENG_DEBUG, "It is normal outgong end case."); + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle:[%d],end_cause_type:[%d]", pcall_core->mo_end_call_handle, pcall_core->mo_end_cause_type); + + memset(&event_data, 0, sizeof(event_data)); + event_data.call_handle = pcall_core->mo_end_call_handle; + event_data.end_cause_type = pcall_core->mo_end_cause_type; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_END_TO_UI, (void *)&event_data); + + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_END, pcall_core->mo_end_call_handle, NULL); + + __vc_core_set_auto_redial_count(pcall_core, 0); + voicecall_core_clear_mo_call(pcall_engine); + + __voicecall_core_mocall_reset_engine_state(pcall_engine); + + /* __vcui_app_view_mo_finish_call() start */ + voicecall_snd_stop_signal(pcall_core->papp_snd); + + voicecall_core_get_total_call_member(pcall_engine, &total_call_member); + /* If No Connected Calls End the UI */ + if (total_call_member == 0) { + /*Reset voice call core to default values */ + voicecall_core_set_to_default(pcall_core); + } else { + voicecall_snd_change_path(pcall_core->papp_snd); + } + /* __vcui_app_view_mo_finish_call() end */ + +} + +static void __voicecall_core_mocall_signal_play_end_cb(gpointer pdata) +{ + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)pdata; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + if (FALSE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "No More calls, resetting path"); + voicecall_snd_change_mm_path(pcall_core->papp_snd, VOICE_CALL_MM_RESET); + _vc_core_util_set_call_status(VCONFKEY_CALL_OFF); + } + + if (TRUE == voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Updating MO UI on signal end"); + __voicecall_core_processing_mo_cancel(pcall_core); + } +} + +static voicecall_snd_signal_type_t __voicecall_core_get_signal_type_from_endcause(int end_cause) +{ + int signal_type = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, "End end_cause_type: %d", end_cause); + + switch (end_cause) { + case VC_ENDCAUSE_USER_BUSY: + case VC_ENDCAUSE_USER_DOESNOT_RESPOND: + case VC_ENDCAUSE_USER_UNAVAILABLE: + case VC_ENDCAUSE_NO_ANSWER: + { + signal_type = VOICE_CALL_SIGNAL_USER_BUSY_TONE; + } + break; + default: + signal_type = VOICE_CALL_SIGNAL_NONE; + break; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Signal Type: %d", signal_type); + + return signal_type; +} + +static void __voicecall_core_handle_normal_end(call_vc_core_state_t *pcall_core, int call_handle, voice_call_end_cause_type_t end_cause) +{ + int total_call_member = 0; + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + /*Set the callstatus to OFF before processing the End Event Animation */ + if (TRUE == voicecall_core_is_connected_call_exist(pcall_engine)) { + _vc_core_util_set_call_status(VCONFKEY_CALL_VOICE_ACTIVE); + } else if ((TRUE == voicecall_core_is_incoming_call_exists(pcall_engine)) || (TRUE == voicecall_core_is_outgoing_call_exists(pcall_engine))) { + _vc_core_util_set_call_status(VCONFKEY_CALL_VOICE_CONNECTING); + } else { + /*Reset the Path. Actual path must be closed when modem path closed!! */ + voicecall_snd_change_mm_path(pcall_core->papp_snd, VOICE_CALL_MM_RESET); + _vc_core_util_set_call_status(VCONFKEY_CALL_OFF); + } + + if (FALSE == voicecall_snd_play_effect_tone(pcall_core->papp_snd, VOICE_CALL_SND_EFFECT_CALL_DISCONNECT)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Effect tone not played, check and play busy tone"); + } + +#ifdef _NEW_SND_ + if ((FALSE == voicecall_core_is_connected_call_exist(pcall_engine)) + && (TRUE == voicecall_core_is_incoming_call_exists(pcall_engine)) + && (voicecall_snd_get_path_status(pcall_core->papp_snd) == VOICE_CALL_SND_PATH_SPEAKER)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming Call: TRUE,Connected Call:FALSE, Speaker: TRUE. So change path to normal"); + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_RECEIVER); + voicecall_snd_change_path(pcall_core->papp_snd); + } +#else + if ((FALSE == voicecall_core_is_connected_call_exist(pcall_engine)) + && (TRUE == voicecall_core_is_incoming_call_exists(pcall_engine)) + && (TRUE == voicecall_snd_get_status(pcall_core->papp_snd, VOICE_CALL_AUDIO_SPEAKER))) { + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming Call: TRUE,Connected Call:FALSE, Speaker: TRUE. So change path to normal"); + voicecall_snd_set_status(pcall_core->papp_snd, VOICE_CALL_AUDIO_SPEAKER, FALSE); + voicecall_snd_change_path(pcall_core->papp_snd); + } +#endif + + voicecall_core_clear_connected_call(pcall_engine, call_handle); + + voicecall_core_get_total_call_member(pcall_engine, &total_call_member); + if (0 == total_call_member) { + voicecall_core_set_to_default(pcall_core); + } + +} + +static gboolean __voicecall_core_handle_rejected_call_end(call_vc_core_state_t *pcall_core, int call_handle) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + voicecall_snd_stop_alert(pcall_core->papp_snd); + + /*Send Incoming call End Event to Blue Tooth */ + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_END, call_handle, NULL); + + if (FALSE == voicecall_core_is_connected_call_exist(pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "No More Calls"); + voicecall_core_set_to_default(pcall_core); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Setting Path for Voicecall"); + /*Change Path to Call, when the incomging call is cancelled. */ + voicecall_snd_change_path(pcall_core->papp_snd); + _vc_core_util_set_call_status(VCONFKEY_CALL_VOICE_ACTIVE); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Reject Call End Processed"); + return TRUE; +} + +static void __voicecall_core_handle_outgoingcall_end(call_vc_core_state_t *pcall_core, int call_handle, voice_call_end_cause_type_t end_cause_type) +{ + gboolean bsignal_play = FALSE; + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle=:%d,end_cause=%d", call_handle, end_cause_type); + pcall_core->mo_end_call_handle = call_handle; + pcall_core->mo_end_cause_type = end_cause_type; + + if (FALSE == voicecall_core_is_connected_call_exist(pcall_engine)) { + voicecall_snd_signal_type_t end_signal_type = VOICE_CALL_SIGNAL_NONE; + /*Play Signal Tone only when the connected calls are not exists */ + end_signal_type = __voicecall_core_get_signal_type_from_endcause(end_cause_type); + + if (end_signal_type != VOICE_CALL_SIGNAL_NONE) { + voicecall_snd_set_signal_type(pcall_core->papp_snd, end_signal_type); + voicecall_snd_play_signal(pcall_core->papp_snd, __voicecall_core_mocall_signal_play_end_cb, pcall_core); + bsignal_play = TRUE; + + /* signal tone play case : just end string updated */ + { + vc_engine_outgoing_end_signal_play_type event_data; + + /* normal outgong end */ + CALL_ENG_DEBUG(ENG_DEBUG, "It is normal outgong end case."); + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle:[%d],end_cause_type:[%d]", call_handle, pcall_core->mo_end_cause_type); + + memset(&event_data, 0, sizeof(event_data)); + event_data.call_handle = call_handle; + event_data.end_cause_type = pcall_core->mo_end_cause_type; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_END_SIGNAL_PLAY_TO_UI, (void *)&event_data); + } + + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Connected call exists, not playing signal tone"); + } + if (TRUE == voicecall_core_is_connected_call_exist(pcall_engine)) { + /* Set phonestatus value */ + _vc_core_util_set_call_status(VCONFKEY_CALL_VOICE_ACTIVE); + } else if (FALSE == bsignal_play) { + /*Reset the Path. Actual path must be closed when modem path closed!! */ + voicecall_snd_change_mm_path(pcall_core->papp_snd, VOICE_CALL_MM_RESET); + _vc_core_util_set_call_status(VCONFKEY_CALL_OFF); + } else { + /* othing to do. */ + } + __voicecall_core_processing_mo_cancel(pcall_core); + +} + +static gboolean __voicecall_core_handle_incoming_call_end(call_vc_core_state_t *pcall_core, int call_handle) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + voicecall_snd_stop_alert(pcall_core->papp_snd); + + /*Send Incoming call End Event to Blue Tooth */ + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_END, call_handle, NULL); + + if (FALSE == voicecall_core_is_connected_call_exist(pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "No More Calls"); + voicecall_core_set_to_default(pcall_core); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Setting Path for Voicecall"); + /*Change Path to Call, when the incomging call is cancelled. */ + voicecall_snd_change_path(pcall_core->papp_snd); + _vc_core_util_set_call_status(VCONFKEY_CALL_VOICE_ACTIVE); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming Call End Processed"); + return TRUE; +} + +static gboolean voicecall_core_cb(int event, int param1, int param2, void *param3, void *puser_data) +{ + CALL_ENG_DEBUG(ENG_WARN, " Engine Event: %s(%d)", gszcall_engine_event[event], event); + + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)puser_data; + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_VC_DUMP_CALLDETAILS(&pcall_engine->call_manager); + + switch (event) { + case VC_CALL_INCOM: + { + int call_handle = param1; + char tel_number[VC_PHONE_NUMBER_LENGTH_MAX]; + gboolean bauto_reject = FALSE; + gboolean bauto_reject_unknown = FALSE; + gboolean restricted = FALSE; + gboolean bcalling_namemode = FALSE; + gboolean brejected_number = FALSE; + vc_engine_incoming_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + CALL_ENG_DEBUG(ENG_DEBUG, "tel_number:[%s]", (char *)param3); + _vc_core_util_strcpy(tel_number, sizeof(tel_number), (char *)param3); + +#ifdef _NEW_SND_ +#else + __voicecall_core_check_headset_earjack_status(pcall_core); +#endif + + /*Changing the path to headset/phone will be decided by user accept action. + This will apply for second incoming call, if the first call was accpeted by BT Headset + and the path was changed to BT headset, then the path will be in headset for second call by default + So reset the headset flag for second call so the path will not + be automatically changed to headset, it will be decided by user action. + If this requirement fits only for first incoming call then comment this fix. */ + /* vcui_app_snd_set_status(papp_document->papp_snd, VCUI_APP_AUDIO_HEADSET, FALSE); */ + + /*Will be set based on user action */ + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT, FALSE); + + if (_vc_core_util_check_video_call_status() == TRUE) { + if (TRUE == __voicecall_core_silent_reject_mt(pcall_core, call_handle)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Call rejected due to silent reject"); + return TRUE; + } + } + + /* Check for Restricted Mode */ + _vc_core_engine_status_isrestricted_call(pcall_engine, call_handle, &restricted); + _vc_core_engine_status_get_calling_namemode(pcall_engine, call_handle, &bcalling_namemode); + if (TRUE == bcalling_namemode) { + call_vc_call_objectinfo_t call_object; + + voicecall_core_get_call_object(pcall_engine, call_handle, &call_object); + CALL_ENG_DEBUG(ENG_DEBUG, "call_object.calling_name:[%s]", call_object.calling_name); + + _vc_core_util_strcpy(event_data.call_name, sizeof(event_data.call_name), call_object.calling_name); + } else if (TRUE == restricted) { + call_vc_call_objectinfo_t call_object; + + voicecall_core_get_call_object(pcall_engine, call_handle, &call_object); + CALL_ENG_DEBUG(ENG_DEBUG, "call_object.name_mode:[%s]", call_object.name_mode); + + event_data.brestricted = TRUE; + if (call_object.name_mode == CALL_VC_NAME_MODE_PAYPHONE) { + event_data.bpayphone = TRUE; + } else { + event_data.bpayphone = FALSE; + + } + event_data.contact_index = -1; + event_data.phone_type = -1; + } + + /* send to ui */ + event_data.call_handle = call_handle; + event_data.brejected = brejected_number; + _vc_core_util_strcpy(event_data.call_num, sizeof(event_data.call_num), tel_number); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_INCOM_TO_UI, (void *)&event_data); + + _vc_core_util_set_sleep_status(CALL_VC_POWER_PROHIBIT_DIMMING); + + /* in case of rejected number, sound & callstatus is not processed */ + if (!brejected_number) { + gboolean benabledTestMode = FALSE; + voicecall_snd_register_cm(pcall_core->papp_snd); + + /*Send Incoming Call Event to Blue Tooth */ + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_INCOM, call_handle, tel_number); + + CALL_ENG_DEBUG(ENG_DEBUG, "Preparing Sound "); + voicecall_snd_prepare_alert(pcall_core->papp_snd, call_handle); + if (FALSE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Changing MM Path just before playing the ring tone"); + voicecall_snd_change_mm_path(pcall_core->papp_snd, VOICE_CALL_MM_RING_TONE); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "2nd MT call alert."); + } + voicecall_snd_play_alert(pcall_core->papp_snd); + + _vc_core_util_set_call_status(VCONFKEY_CALL_VOICE_CONNECTING); + } + + } + break; + + case VC_CALL_OUTGOING: + { + int call_handle = param1; + vc_engine_common_with_handle_type event_data; + memset(&event_data, 0, sizeof(event_data)); + + CALL_ENG_DEBUG(ENG_DEBUG, "MO Call Start: Call handle %d", call_handle); + } + break; + + case VC_CALL_OUTGOING_ORIG: + { + int call_handle = param1; + vc_engine_outgoing_orig_type event_data; + call_vc_call_objectinfo_t callobject_info; + + memset(&event_data, 0, sizeof(event_data)); + event_data.call_handle = call_handle; + if (pcall_core->call_setup_info.call_type == VC_CALL_ORIG_TYPE_EMERGENCY) { + event_data.bemergency = TRUE; + } else { + event_data.bemergency = FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, bemergency:[%d]", event_data.call_handle, event_data.bemergency); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_ORIG_TO_UI, (void *)&event_data); + _voicecall_dvc_proximity_sensor_init(pcall_core); + + g_set_path_timer_handler = g_timeout_add(SET_PATH_TIMER_VALUE, __voicecall_core_set_path_timer_cb, pcall_core); + + /*Send Event to Blue Tooth */ + voicecall_core_get_call_object(pcall_engine, call_handle, &callobject_info); + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_ORIG, call_handle, callobject_info.tel_number); + } + break; + + case VC_CALL_OUTGOING_ALERT: + { + int call_handle = param1; + vc_engine_common_with_handle_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + PRINT_CURRENT_TIME("Alert Indication received at "); + + event_data.call_handle = call_handle; + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_ALERT_TO_UI, (void *)&event_data); + + /*Play Connected Effect Tone */ + CALL_ENG_KPI("voicecall_snd_play_effect_tone start"); + if (FALSE == voicecall_snd_play_effect_tone(pcall_core->papp_snd, VOICE_CALL_SND_EFFECT_CALL_CONNECT)) { + CALL_ENG_DEBUG(ENG_DEBUG, "voicecall_snd_play_effect_tone return value is FALSE"); + voicecall_snd_change_path(pcall_core->papp_snd); + } + CALL_ENG_KPI("voicecall_snd_play_effect_tone done"); + + CALL_ENG_KPI("_vc_bt_send_response_to_bt start"); + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_REMOTE_RINGING, call_handle, NULL); + CALL_ENG_KPI("_vc_bt_send_response_to_bt done"); + } + break; + + case VC_CALL_ANSWER_CNF: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Answer confirm"); + if (_vc_core_cm_get_call_member_count(&(pcall_engine->call_manager)) == 1) { + CALL_ENG_DEBUG(ENG_DEBUG, "single call state"); + voicecall_snd_change_path(pcall_core->papp_snd); + } + } + break; + + case VC_CALL_CONNECTED: + { + int call_handle = param1; + vc_engine_connected_type event_data; + int bstatus = FALSE; + + memset(&event_data, 0, sizeof(event_data)); + + CALL_ENG_DEBUG(ENG_DEBUG, "Connected Call Handle : %d", call_handle); + + event_data.call_handle = call_handle; + event_data.bt_status = (int)_vc_bt_get_bt_status(); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_CONNECTED_TO_UI, (void *)&event_data); + _voicecall_dvc_proximity_sensor_init(pcall_core); + + voicecall_snd_change_path(pcall_core->papp_snd); + + /* Set phonestatus value */ + _vc_core_util_set_call_status(VCONFKEY_CALL_VOICE_ACTIVE); + _vc_core_util_set_sleep_status(CALL_VC_POWER_GRANT_DIMMING); + + /* check minute minder */ + if (vconf_get_bool(VCONFKEY_CISSAPPL_MINUTE_MINDER_BOOL, &bstatus)) { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_bool failed."); + } + if (bstatus) { + if (pcall_core->minute_minder_timer == 0) { + pcall_core->minute_minder_timer = g_timeout_add(MINUTE_MINDER_TIMEOUT_VALUE, __voicecall_core_minute_minder, pcall_core); + } + } + + /*Send Event to Blue Tooth */ + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_CONNECT, call_handle, NULL); + + /*Call is accepted, reset the flag */ + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT, FALSE); + +#ifdef PDIAL_SEND_DTMF + g_idle_add(voicecall_core_send_phone_number_dtmf, (gpointer) call_handle); +#endif + } + break; + + case VC_CALL_NORMAL_END: + { + int call_handle = param1; + voice_call_end_cause_type_t end_cause = param2; + vc_engine_normal_end_type event_data; + int active_call_members = -1; + + memset(&event_data, 0, sizeof(event_data)); + + CALL_ENG_DEBUG(ENG_DEBUG, "Normal End Call Handle : %d,End Cause=%d", call_handle, end_cause); + + event_data.call_handle = call_handle; + event_data.end_cause_type = end_cause; + + __voicecall_core_handle_normal_end(pcall_core, call_handle, end_cause); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_NORMAL_END_TO_UI, (void *)&event_data); + + /*Send Event to Blue Tooth */ + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_END, call_handle, NULL); + } + break; + + case VC_CALL_INCOM_END: + { + int call_handle = param1; + vc_engine_common_with_handle_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming call End Call Handle: %d", call_handle); + + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT, FALSE); + + if (TRUE == __voicecall_core_handle_call_end_on_silent_reject(pcall_core, call_handle)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Call end processed for silent reject:"); + return TRUE; + } + + event_data.call_handle = call_handle; + + __voicecall_core_handle_incoming_call_end(pcall_core, call_handle); + + _vc_core_util_set_sleep_status(CALL_VC_POWER_GRANT_DIMMING); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_INCOM_END_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_INCOM_DROPPED: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Check it. Not used"); + } + break; + + case VC_CALL_REJECTED_END: + { + int call_handle = param1; + vc_engine_common_with_handle_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + CALL_ENG_DEBUG(ENG_DEBUG, "Rejected call End Call Handle: %d", call_handle); + + event_data.call_handle = call_handle; + + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT, FALSE); + + __voicecall_core_handle_rejected_call_end(pcall_core, call_handle); + + _vc_core_util_set_sleep_status(CALL_VC_POWER_GRANT_DIMMING); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_REJECTED_END_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_OUTGOING_END: + { + int call_handle = param1; + int end_cause_type = param2; + int bauto_redial = -1; + + CALL_ENG_DEBUG(ENG_DEBUG, "end cause type :[%d]", end_cause_type); + + if (vconf_get_bool(VCONFKEY_CISSAPPL_VOICE_AUTO_REDIAL_BOOL, &bauto_redial)) { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_bool failed."); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "bauto_redial:[%d]", bauto_redial); + + if ((TRUE == bauto_redial) && (FALSE == voicecall_core_is_connected_call_exist(pcall_engine)) + && (FALSE == voicecall_core_get_status(pcall_core, CALL_VC_CORE_FLAG_MOCALL_END_BY_USER)) + && (TRUE == __voicecall_core_is_redial_cuase(end_cause_type))) { + /* auto redial */ + CALL_ENG_DEBUG(ENG_DEBUG, "It is auto redial case."); + + _vc_core_util_set_call_status(VCONFKEY_CALL_OFF); + + vc_engine_outgoing_end_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + event_data.call_handle = call_handle; + event_data.end_cause_type = end_cause_type; + event_data.bauto_redial = TRUE; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_END_TO_UI, (void *)&event_data); + } else { + __voicecall_core_handle_outgoingcall_end(pcall_core, call_handle, end_cause_type); + } + _vc_core_util_set_sleep_status(CALL_VC_POWER_GRANT_DIMMING); + } + break; + + case VC_CALL_OUTGOING_ABORTED: + { + vc_engine_common_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_ABORTED_TO_UI, (void *)&event_data); + + _vc_core_util_set_sleep_status(CALL_VC_POWER_GRANT_DIMMING); + } + break; + + case VC_CALL_DTMF_ACK: + { + gboolean bsuccess = param1; + CALL_ENG_DEBUG(ENG_DEBUG, "bsuccess:[%d]", bsuccess); +#ifdef PDIAL_SEND_DTMF + __voicecall_core_handle_dtmf_ack(pcall_core, bsuccess); +#endif + } + break; + + case VC_CALL_AUTO_REDIAL_CHECK: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Check it. Not used"); + } + break; + + case VC_CALL_SS_HELD: + { + int io_state = -1; + int call_handle = param1; + vc_engine_common_type event_data; + PRINT_CURRENT_TIME("Call Hold Ends at"); + + /* held popup shold not be displayed on outgoing popup */ + memset(&event_data, 0, sizeof(event_data)); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_SS_HELD_TO_UI, (void *)&event_data); + + /*Send Event to Blue Tooth */ + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_HOLD, call_handle, NULL); + } + break; + + case VC_CALL_SS_RETREIVED: + { + int call_handle = param1; + vc_engine_common_type event_data; + PRINT_CURRENT_TIME("Call Retrieve Ends at"); + + /* held popup shold not be displayed on outgoing popup */ + memset(&event_data, 0, sizeof(event_data)); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_SS_RETREIVED_TO_UI, (void *)&event_data); + + /*Send Event to Blue Tooth */ + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_RETRIEVE, call_handle, NULL); + } + break; + + case VC_CALL_SS_SWAP: + { + vc_engine_common_type event_data; + + int call_handle = param1; + PRINT_CURRENT_TIME("Call Swap Ends at"); + + memset(&event_data, 0, sizeof(event_data)); + + /* Show Call Swapped Message Box */ + vcall_engine_send_event_to_client(VC_ENGINE_MSG_SS_SWAP_TO_UI, (void *)&event_data); + + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_SWAPPED, call_handle, NULL); + } + break; + + case VC_CALL_SS_SETUP_CONF: + { + vc_engine_common_type event_data; + + PRINT_CURRENT_TIME("Setup Conf Ends at"); + + memset(&event_data, 0, sizeof(event_data)); + + /* Show Call Joined Message Box */ + vcall_engine_send_event_to_client(VC_ENGINE_MSG_SS_SETUP_CONF_TO_UI, (void *)&event_data); + + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_JOINED, 0, NULL); + } + break; + + case VC_CALL_SS_SPLIT_CONF: + { + vc_engine_common_with_handle_type event_data; + int call_handle = param1; + CALL_ENG_DEBUG(ENG_DEBUG, "The handle to be split is %d", call_handle); + + PRINT_CURRENT_TIME("Split Conf Ends at"); + + memset(&event_data, 0, sizeof(event_data)); + event_data.call_handle = call_handle; + + /* Show Private Call Message Box */ + vcall_engine_send_event_to_client(VC_ENGINE_MSG_SS_SPLIT_CONF_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_SS_TRANSFERRED: + { + vc_engine_common_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_SS_TRANSFERRED_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_SS_CONNECT_LINE_IND: + { + int call_handle = param1; + char *pconnected_number = (char *)param3; + vc_engine_msg_box_type event_data; + + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle : [%d]", call_handle); + + /* check whether Call Info for recevice Call Handle exists or not. */ + + if ((pconnected_number != NULL) && (strlen(pconnected_number) > 0)) { + CALL_ENG_DEBUG(ENG_DEBUG, "connected line ind : [%s]", pconnected_number); + + memset(&event_data, 0, sizeof(event_data)); + + event_data.string_id = IDS_CALL_POP_CALL_IS_DIVERTED; + _vc_core_util_strcpy(event_data.diverted_num, sizeof(event_data.diverted_num), pconnected_number); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "No conneccted info"); + } + + } + break; + + case VC_CALL_IND_FORWARD: + { + vc_engine_ind_forward_type event_data; + int fwd_type = param1; + + memset(&event_data, 0, sizeof(event_data)); + event_data.fwd_type = fwd_type; + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_IND_FORWARD_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_IND_ACTIVATE: + { + vc_engine_common_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_IND_ACTIVATE_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_IND_HOLD: + { + vc_engine_common_type event_data; + int call_handle = param1; + + memset(&event_data, 0, sizeof(event_data)); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_IND_HOLD_TO_UI, (void *)&event_data); + + /*Send Event to Blue Tooth */ + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_HOLD, call_handle, NULL); + } + break; + + case VC_CALL_IND_TRANSFER: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Not used."); + } + break; + + case VC_CALL_IND_SETUPCONFERENCE: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Not used."); + } + break; + + case VC_CALL_IND_BARRING: + { + vc_engine_common_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_IND_BARRING_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_IND_WAITING: + { + vc_engine_common_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_IND_WAITING_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_IND_CUGINFO: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Not used."); + } + break; + + case VC_CALL_IND_SSNOTIFY: + { + vc_engine_ind_ssnotify_type event_data; + int ss_type = param1; + + memset(&event_data, 0, sizeof(event_data)); + event_data.ss_type = ss_type; + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_IND_SSNOTIFY_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_IND_CALLINGNAMEINFO: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Not used."); + } + break; + case VC_CALL_IND_ACTIVATECCBS_CNF: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Not used."); + } + break; + + case VC_CALL_IND_ACTIVATECCBS_USERINFO: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Not used."); + } + break; + + case VC_CALL_IND_AOC: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Not yet."); + } + break; + + case VC_ERROR_OCCURED: + { + int error_code = param1; + + CALL_ENG_DEBUG(ENG_DEBUG, "error code:[%d]", error_code); + switch (error_code) { + case ERROR_VOICECALL_INVALID_DTMF_CHAR: + case ERROR_VOICECALL_DTMF_FAILED: + { + vc_engine_error_occured_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + event_data.error_code = error_code; + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_ERROR_OCCURED_TO_UI, (void *)&event_data); + } + break; + default: + { + vc_engine_msg_box_type event_data; + int string_id = -1; + + string_id = __voicecall_core_get_string_id_by_errorcode(error_code); + + memset(&event_data, 0, sizeof(event_data)); + event_data.string_id = __voicecall_core_get_string_id_by_errorcode(error_code); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + break; + } + } + break; + + case VC_ACTION_INCOM_FORCE: + { + int call_handle = param1; + vc_engine_common_with_handle_type event_data; + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d", call_handle); + + memset(&event_data, 0, sizeof(event_data)); + event_data.call_handle = call_handle; + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_ACTION_INCOM_FORCE_TO_UI, (void *)&event_data); + } + break; + + case VC_ACTION_SAT_REQUEST: + { + if (SAT_RQST_SETUP_CALL == param1) { + voicecall_sat_callinfo_t *psat_callinfo = (voicecall_sat_callinfo_t *) param3; + vc_engine_outgoing_type event_data; + + if (psat_callinfo == NULL) { + CALL_ENG_DEBUG(ENG_ERR, "psat_callinfo is NULL.."); + assert(psat_callinfo != NULL); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "VC_ACTION_SAT_REQUEST is received by Voice call."); + pcall_core->call_setup_info.call_setup_by = VC_CALL_SETUP_BY_SAT; + pcall_core->call_setup_info.call_type = VC_CALL_ORIG_TYPE_SAT; + + /*Phone Number */ + _vc_core_util_strcpy(pcall_core->call_setup_info.source_tel_number, VC_PHONE_NUMBER_LENGTH_MAX, psat_callinfo->call_number); + _vc_core_engine_extract_phone_number(pcall_core->call_setup_info.source_tel_number, pcall_core->call_setup_info.tel_number, VC_PHONE_NUMBER_LENGTH_MAX); + + /*Name */ + CALL_ENG_DEBUG(ENG_ERR, "psat_callinfo->disp_text:[%s]", psat_callinfo->disp_text); + + memset(&event_data, 0, sizeof(event_data)); + _vc_core_util_strcpy(event_data.call_num, sizeof(event_data.call_num), pcall_core->call_setup_info.tel_number); + event_data.contact_index = -1; + event_data.phone_type = -1; + _vc_core_util_strcpy(event_data.call_num, sizeof(event_data.call_num), psat_callinfo->disp_text); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_TO_UI, (void *)&event_data); + + /*Get Icon Information */ + if (TRUE == psat_callinfo->bicon_present) { /*bicon_present is TRUE when SAT icon info available and when GCF is enabled */ + CALL_ENG_DEBUG(ENG_ERR, "SAT icon available."); + } + + /* Prepare and Make Call with the Give Information */ + if (FALSE == voicecall_core_setup_call(pcall_core, FALSE)) { + /*Send Response to SAT Engine */ + voicecall_core_send_sat_response(pcall_core->pcall_engine, SAT_RQST_SETUP_CALL, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + } + } + } else if (SAT_RQST_SEND_DTMF == param1) { + voicecall_sat_callinfo_t *psat_callinfo = (voicecall_sat_callinfo_t *) param3; + + CALL_ENG_DEBUG(ENG_DEBUG, "SAT Send DTMF Number: %s, hidden: %d", psat_callinfo->call_number, psat_callinfo->bsat_hidden); + __voicecall_core_queue_dtmf_string(pcall_core, psat_callinfo->call_number, TRUE); + } else { + CALL_ENG_DEBUG(ENG_ERR, "Invalid SAT Request Type: %d", param2); + } + } + break; + + case VC_ACTION_SAT_RESPONSE: + { + if (SAT_RESP_SETUP_CALL == param1) { + voicecall_sat_callinfo_t *psat_call_info = (voicecall_sat_callinfo_t *) param3; + + CALL_ENG_DEBUG(ENG_DEBUG, "sat_mo_call_ctrl_res = %d", psat_call_info->sat_mo_call_ctrl_res); + + if (CALL_NOT_ALLOWED == psat_call_info->sat_mo_call_ctrl_res) { + vc_engine_msg_box_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + event_data.string_id = IDS_CALL_POP_CALLNOTCALLOWED; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } else if (CALL_ALLOWED_WITH_MOD == psat_call_info->sat_mo_call_ctrl_res) { + CALL_ENG_DEBUG(ENG_DEBUG, "psat_call_info->call_number = [%s]", psat_call_info->call_number); + CALL_ENG_DEBUG(ENG_DEBUG, "psat_call_info->disp_text = [%s]", psat_call_info->disp_text); +#ifdef _OLD_SAT_ + mocall_index = vcui_app_doc_get_mocall_index(papp_document); + + /*Update MO CALL Display Data with the SAT modified info */ + if (mocall_index != -1) { + vcui_app_call_display_data_t display_data; + vcui_app_call_display_data_t new_display_data; + vcui_app_view_mo_state_t *pmo_state = NULL; + + if (FALSE == vcui_app_cdm_get_display_object_byindex(&papp_document->call_display_manager, mocall_index, &display_data)) { + return TRUE; + } + + vcui_app_cdm_clear_display_object(&new_display_data); + + /*Copy all must parameters required for MO Call */ + new_display_data.call_handle = display_data.call_handle; + new_display_data.call_index = display_data.call_index; + new_display_data.call_type = display_data.call_type; + new_display_data.start_time = display_data.start_time; + new_display_data.used = display_data.used; + + if (strlen(psat_call_info->call_number) > 0) { + vcui_app_util_strcpy(new_display_data.source_tel_number, sizeof(new_display_data.source_tel_number), psat_call_info->call_number); + _vc_core_engine_extract_phone_number(new_display_data.source_tel_number, new_display_data.tel_number, VC_PHONE_NUMBER_LENGTH_MAX); + } + + if (strlen(psat_call_info->disp_text) > 0) { + vcui_app_util_strcpy(new_display_data.name, sizeof(new_display_data.name), psat_call_info->disp_text); + } + + /* todo, Check whether contact search need to be done for the SAT modified number */ + + /*Set the newly modified data to the CDM */ + vcui_app_cdm_set_display_object(pdisplay_mgr, &new_display_data); + + /*Update the MO View */ + pmo_state = (vcui_app_view_mo_state_t *) calloc(1, sizeof(vcui_app_view_mo_state_t)); + pmo_state->mo_call_state = VCUI_MO_CALL_STATE_UPDATE; + + /* Update MO Call Screen View to update the connection status */ + dv_view_manager_update_view(dv_document_get_view_manager(DV_DOCUMENT(papp_document)), VCUI_APP_VIEWID_MO_VIEW, VCUI_APP_UPD_MO_SET_STATE, pmo_state); + + } else { + VCUI_DEBUG(VCUI_LOG_ERR, "Invalid Mo Call Index: %d", mocall_index); + } +#endif + } else if (CALL_CHANGED_TO_SS == psat_call_info->sat_mo_call_ctrl_res) { + /*Issue notification to Launch SS */ + } + } + } + break; + + case VC_ACTION_CALL_END_HELD_RETREIVED: + { + int call_handle = param1; + vc_engine_common_with_handle_type event_data; + + CALL_ENG_DEBUG(ENG_DEBUG, "call handle:[%d]", call_handle); + + memset(&event_data, 0, sizeof(event_data)); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_ACTION_CALL_END_HELD_RETREIVED_TO_UI, (void *)&event_data); + } + break; + + case VC_ACTION_NO_ACTIVE_TASK: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Not yet."); + } + break; + + case VC_CALL_GET_VOLUME_RESP: + { + vc_engine_vol_resp_type event_data; + + CALL_ENG_DEBUG(ENG_DEBUG, "Current Voicecall (TAPI)Volume Type %d, Current Volume Level: %d", param1, param2); + + memset(&event_data, 0, sizeof(event_data)); + event_data.vol_alert_type = VOICE_CALL_VOL_TYPE_VOICE; + event_data.vol_level = param2; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_GET_VOLUME_RESP_TO_UI, (void *)&event_data); + } + break; + + default: + CALL_ENG_DEBUG(ENG_DEBUG, " Engine Event ID : %d not handled", event); + break; + } + + CALL_VC_DUMP_CALLDETAILS(&pcall_engine->call_manager); + + CALL_ENG_DEBUG(ENG_DEBUG, " Ended."); + + return TRUE; +} + +/** + * This function converts Error Code to string id. + * + * @return string id + * @param[in] error_code error code to be used to display the message content + */ +static int __voicecall_core_get_string_id_by_errorcode(int error_code) +{ + int string_id = -1; + switch (error_code) { + case ERROR_VOICECALL_DTMF_FAILED: + string_id = IDS_CALL_POP_DTMFSENDING_FAIL; + break; + + case ERROR_VOICECALL_CALL_NOT_ALLOWED: + string_id = IDS_CALL_POP_CALLNOTCALLOWED; + break; + + case ERROR_VOICECALL_CALL_IMPOSSIBLE_NOSIM_NOEMERGNUM: + string_id = IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE; + break; + + case ERROR_VOICECALL_EMERGENCY_CALLS_ONLY: + string_id = IDS_CALL_POP_CALLING_EMERG_ONLY; + break; + + case ERROR_VOICECALL_PHONE_NOT_INITIALIZED: + string_id = IDS_CALL_POP_PHONE_NOT_INITIALISED; + break; + + case ERROR_VOICECALL_ANSWER_FAILED: + string_id = IDS_CALL_POP_CALLFAILED; + break; + + case ERROR_VOICECALL_HOLD_REJECTED: + case ERROR_VOICECALL_HOLD_FAILED: + string_id = IDS_CALL_POP_HOLD_FAILED; + break; + + case ERROR_VOICECALL_ACTIVATE_REJECTED: + case ERROR_VOICECALL_RETREIVE_FAILED: + string_id = IDS_CALL_POP_UNABLE_TO_RETRIEVE; + break; + + case ERROR_VOICECALL_SWAP_REJECTED: + case ERROR_VOICECALL_SWAP_FAILED: + string_id = IDS_CALL_POP_SWAP_FAILED; + break; + + case ERROR_VOICECALL_SPLIT_CONF_FAILED: + string_id = IDS_CALL_POP_SPLIT_FAILED; + break; + + case ERROR_VOICECALL_SETUP_CONF_FAILED: + string_id = IDS_CALL_POP_JOIN_FAILED; + break; + + case ERROR_VOICECALL_TRANSFER_FAILED: + string_id = IDS_CALL_POP_TRANSFER_FAILED; + break; + + case ERROR_VOICECALL_SWAP_NOT_SUPPORTED: + string_id = IDS_CALL_POP_SWAP_NOT_SUPPORTED; + break; + + case ERROR_VOICECALL_HOLD_NOT_SUPPORTED: + string_id = IDS_CALL_POP_HOLD_NOT_SUPPORTED; + break; + + case ERROR_VOICECALL_RETREIVE_NOT_SUPPORTED: + string_id = IDS_CALL_POP_UNHOLD_NOT_SUPPORTED; + break; + + case ERROR_VOICECALL_SETUP_CONF_NOT_SUPPORTED: + string_id = IDS_CALL_POP_JOIN_NOT_SUPPORTED; + break; + + case ERROR_VOICECALL_SPLIT_CONF_NOT_SUPPORTED: + string_id = IDS_CALL_POP_SPLIT_NOT_SUPPORTED; + break; + case ERROR_VOICECALL_TRANSFER_NOT_SUPPORTED: + string_id = IDS_CALL_POP_TRANSFER_NOT_SUPPORTED; + break; + + case ERROR_VOICECALL_INCOMPLETE: + string_id = IDS_CALL_POP_INCOMPLETE; + break; + + case ERROR_VOICECALL_UNAVAILABLE: + string_id = IDS_CALL_POP_UNAVAILABLE; + break; + + case ERROR_VOICECALL_TAPI_CAUSE_CALL_FAILED: + string_id = IDS_CALL_POP_CALLFAILED; + break; + + case ERROR_VOICECALL_INVALID_CALL_TYPE: + case ERROR_VOICECALL_INVALID_TELEPHONE_NUMBER: + string_id = IDS_CALL_POP_CAUSE_WRONG_NUMBER; + break; + + default: + CALL_ENG_DEBUG(ENG_DEBUG, " Invalid Error Code: %x", error_code); + string_id = IDS_CALL_POP_CALLFAILED; + break; + } + return string_id; +} + +gboolean voicecall_core_set_to_default(call_vc_core_state_t *pcall_core) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ""); + if (pcall_core->pcall_engine == NULL) + return FALSE; + + /*Set Engine states to default */ + _vc_core_engine_set_to_default_values(pcall_core->pcall_engine); + + /*Initialize MO Call Setup Info */ + pcall_core->call_setup_info.mo_call_index = VC_TAPI_INVALID_CALLHANDLE; + pcall_core->call_setup_info.call_setup_by = VC_CALL_SETUP_BY_NORMAL; + + pcall_core->call_setup_info.mo_call_index = VC_TAPI_INVALID_CALLHANDLE; + pcall_core->call_setup_info.call_setup_by = VC_CALL_SETUP_BY_NORMAL; + memset(pcall_core->call_setup_info.tel_number, 0, sizeof(pcall_core->call_setup_info.tel_number)); + + pcall_core->mo_redial_timer = -1; + __vc_core_set_auto_redial_count(pcall_core, 0); + + _vc_core_util_set_call_status(VCONFKEY_CALL_OFF); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_NONE, TRUE); + _vc_core_util_set_sleep_status(CALL_VC_POWER_NORMAL_STATUS); + + pcall_core->bt_connected = _vc_bt_get_bt_status(); + if (FALSE == pcall_core->bt_connected) { +#ifdef _NEW_SND_ + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_RECEIVER); +#else + voicecall_snd_set_status(pcall_core->papp_snd, VOICE_CALL_AUDIO_HEADSET, pcall_core->bt_connected); +#endif + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "BT connected, Not changing the sound status"); + } + + /* sound reset */ + voicecall_snd_unregister_cm(pcall_core->papp_snd); + + return TRUE; +} + +static void __voicecall_core_mocall_reset_engine_state(voicecall_engine_t *pcall_engine) +{ + int eng_state = VC_INOUT_STATE_NONE; + + voicecall_core_get_engine_state(pcall_engine, &eng_state); + + CALL_ENG_DEBUG(ENG_DEBUG, "current engine state is: %d", eng_state); + + if ((eng_state > VC_INOUT_STATE_OUTGOING_START) && (eng_state < VC_INOUT_STATE_OUTGOING_END)) { + voicecall_core_change_engine_state(pcall_engine, VC_INOUT_STATE_NONE); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Engine state is already changed, current engine state is: %d", eng_state); + CALL_VC_DUMP_CALLDETAILS(&pcall_engine->call_manager); + } +} + +/** + * This function initialize voicecall core + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] pcallback_func callback function + */ +int voicecall_core_init(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = NULL; + + if (ERROR_VOICECALL_NONE != _vc_core_engine_init(&pcall_engine, (voicecall_cb) voicecall_core_cb, pcall_core)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Voicecall Engine Init Failed"); + return FALSE; + } + + if (FALSE == voicecall_snd_init(pcall_core, &pcall_core->papp_snd)) { + CALL_ENG_DEBUG(ENG_DEBUG, "voicecall_snd_init() failed"); + return FALSE; + } + /*Store Voicecall Engine Handle */ + pcall_core->pcall_engine = pcall_engine; + + _vc_bt_status_init(pcall_core); + + _voicecall_dvc_earjack_init(pcall_core); + + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_NONE, TRUE); + return TRUE; +} + +/** + * This function prepares a voice call with the given data + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] bemergency emergency call or not from dialer + * @param[in] + */ +gboolean voicecall_core_setup_call(call_vc_core_state_t *pcall_core, gboolean bemergency) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + voicecall_setup_info_t setupcall_info = { 0, }; + voicecall_error_t error_code = -1; + gboolean bemergency_call = FALSE; + int io_state; + gboolean bmocall_exists = FALSE; + gboolean bmtcall_exists = FALSE; + int nw_status = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SOS_CALL_ONLY, bemergency); + + _vc_core_engine_status_isexists_call_bytype(pcall_engine, VC_OUTGOING_CALL, &bmocall_exists); + if (TRUE == bmocall_exists) { + CALL_ENG_DEBUG(ENG_DEBUG, "MO call is in progress..."); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + return FALSE; + } + + /*Ignore the MO Call, if already an Incoming call is in progress, MT Call is given high priority */ + _vc_core_engine_status_isexists_call_bytype(pcall_engine, VC_INCOMING_CALL, &bmtcall_exists); + if (TRUE == bmtcall_exists) { + CALL_ENG_DEBUG(ENG_DEBUG, "MT call is in progress"); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + return FALSE; + } + + if (TRUE == _vc_core_util_check_video_call_status()) { + CALL_ENG_DEBUG(ENG_DEBUG, "Voice call is not allowed during video call..."); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + vc_engine_msg_box_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + event_data.string_id = IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + + return FALSE; + } + + if (TRUE == _vc_core_util_get_SAP_status()) { + CALL_ENG_DEBUG(ENG_DEBUG, "SAP is on"); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + vc_engine_msg_box_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + event_data.string_id = IDS_CALL_POP_UNAVAILABLE; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + + return FALSE; + } + + /*Prpare a call with the Voicecall Engine */ + setupcall_info.call_type = pcall_core->call_setup_info.call_type; + _vc_core_util_strcpy(setupcall_info.source_tel_number, sizeof(setupcall_info.source_tel_number), pcall_core->call_setup_info.source_tel_number); + _vc_core_util_strcpy(setupcall_info.tel_number, sizeof(setupcall_info.tel_number), pcall_core->call_setup_info.tel_number); + + /*Get CUG Details */ + _vc_core_util_get_cug_info(&setupcall_info); + + /*Get Identity Mode */ + _vc_core_util_get_identity_mode(&setupcall_info); + + CALL_ENG_DEBUG(ENG_DEBUG, "identity_mode = [%d], tel_number = [%s]", setupcall_info.identity_mode, setupcall_info.tel_number); + + error_code = _vc_core_engine_prepare_call(pcall_engine, &setupcall_info); + if (ERROR_VOICECALL_NONE != error_code) { + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_engine_prepare_call failed, error code: %d", error_code); + _vc_core_engine_finalize_call(pcall_engine, VC_OUTGOING_CALL, -1); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + vc_engine_msg_box_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + event_data.string_id = __voicecall_core_get_string_id_by_errorcode(error_code); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + return FALSE; + } + pcall_core->call_setup_info.call_type = setupcall_info.call_type; + CALL_ENG_DEBUG(ENG_DEBUG, "call_type:[%d]", pcall_core->call_setup_info.call_type); + + pcall_core->call_setup_info.mo_call_index = setupcall_info.mo_call_index; + if (TRUE == _vc_core_util_is_offline_mode()) { + _vc_core_engine_finalize_call(pcall_engine, VC_OUTGOING_CALL, -1); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + + vc_engine_msg_box_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + event_data.string_id = IDS_CALL_POP_CHANGEOFFLINEMODETOCALL; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + return FALSE; + } + + /* Check for Following Conditions , only if not emergency Number */ + CALL_ENG_DEBUG(ENG_DEBUG, "mo_call_index = [%d]", setupcall_info.mo_call_index); + error_code = _vc_core_engine_status_check_emergency_byindex(pcall_engine, setupcall_info.mo_call_index, &bemergency_call); + if (ERROR_VOICECALL_NONE != error_code) { + CALL_ENG_DEBUG(ENG_DEBUG, "Emergency Check Error code: %d", error_code); + } + + /*Check PwLock */ + if (TRUE == _vc_core_util_is_pwlock()) { + CALL_ENG_DEBUG(ENG_DEBUG, "PwLock is enabled."); + if (bemergency_call == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Only emergency call is possible."); + _vc_core_engine_finalize_call(pcall_engine, VC_OUTGOING_CALL, -1); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + + vc_engine_msg_box_type event_data; + memset(&event_data, 0, sizeof(event_data)); + event_data.string_id = IDS_CALL_POP_CALLING_EMERG_ONLY; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + + return FALSE; + } + } + + /*Check for the following cases, if the call is not emergency call */ + if (FALSE == bemergency_call) { + vc_engine_msg_box_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + /* Check for NW Status and Emergency Mode */ + if (FALSE == _vc_core_util_get_nw_status(&nw_status)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Can't get a network status..."); + _vc_core_engine_finalize_call(pcall_engine, VC_OUTGOING_CALL, -1); + + event_data.string_id = IDS_CALL_POP_CALLNOTCALLOWED; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + return FALSE; + } else { + if ((VCONFKEY_TELEPHONY_SVCTYPE_NONE == nw_status) || (VCONFKEY_TELEPHONY_SVCTYPE_NOSVC == nw_status) || (VCONFKEY_TELEPHONY_SVCTYPE_SEARCH == nw_status)) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Service: Call not Allowed"); + _vc_core_engine_finalize_call(pcall_engine, VC_OUTGOING_CALL, -1); + event_data.string_id = IDS_CALL_POP_CALLNOTCALLOWED; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + return FALSE; + } else if ((VCONFKEY_TELEPHONY_SVCTYPE_EMERGENCY == nw_status)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Emergency mode: Emergency call only..."); + _vc_core_engine_finalize_call(pcall_engine, VC_OUTGOING_CALL, -1); + event_data.string_id = IDS_CALL_POP_CALLING_EMERG_ONLY; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + return FALSE; + } else { + /* ok. */ + } + + } + +#ifdef VC_ENG_FDN_SUPPORT + /*Check FDN Status */ + if (setupcall_info.call_setup_by != VC_CALL_SETUP_BY_SAT) { + if (FALSE == voicecall_core_check_fdn_status(pcall_core)) { + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + return FALSE; + } + } +#endif + + /*Check for voicemail number if it is not an emergency call */ + } + + CALL_ENG_DEBUG(ENG_DEBUG, "MO Call Setup OVer"); + +#ifdef _NEW_SND_ + if(_vc_bt_get_bt_status() == TRUE){ + voicecall_snd_set_path_status(pcall_core->papp_snd,VOICE_CALL_SND_PATH_BT); + } +#endif + + voicecall_core_make_call(pcall_core); + + return TRUE; +} + +/** + * This function makes the actual voicecall prepared by the #voicecall_core_setup_call + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_make_call(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + voicecall_error_t error_code = ERROR_VOICECALL_NONE; + int call_handle = -1; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + _vc_core_util_set_sleep_status(CALL_VC_POWER_PROHIBIT_DIMMING); + + /*Make Actual Call with Voicecall Engine */ + error_code = _vc_core_engine_make_call(pcall_engine, pcall_core->call_setup_info.mo_call_index, &call_handle); + if (ERROR_VOICECALL_NONE != error_code) { + vc_engine_msg_box_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + _vc_core_engine_finalize_call(pcall_engine, VC_OUTGOING_CALL, -1); + + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_engine_make_call Failed: Error_Code: %d..", error_code); + + switch (error_code) { + case ERROR_VOICECALL_TAPI_CAUSE_CALL_FAILED: + event_data.string_id = IDS_CALL_POP_CALLFAILED; + break; + + case ERROR_VOICECALL_CALL_IMPOSSIBLE_NOSIM_NOEMERGNUM: + event_data.string_id = IDS_CALL_POP_CALLFAILED; + break; + + default: + event_data.string_id = IDS_CALL_BODY_CALLENDED; + break; + } + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + + _vc_core_util_set_sleep_status(CALL_VC_POWER_GRANT_DIMMING); + + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle After Setup Call %d.", call_handle); + + voicecall_snd_register_cm(pcall_core->papp_snd); + + /* Set phonestatus value */ + _vc_core_util_set_call_status(VCONFKEY_CALL_VOICE_CONNECTING); + + return TRUE; +} + +/** + * This function processed sat setup call + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] +*/ +gboolean voicecall_core_process_sat_setup_call(vcall_engine_sat_setup_call_info_t *sat_setup_call_info) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ""); + TelSatSetupCallIndCallData_t *SatSetupCallIndCallInfo = NULL; + + SatSetupCallIndCallInfo = (TelSatSetupCallIndCallData_t *) calloc(1, sizeof(TelSatSetupCallIndCallData_t)); + if (NULL == SatSetupCallIndCallInfo) + return FALSE; + + SatSetupCallIndCallInfo->commandId = sat_setup_call_info->command_id; + SatSetupCallIndCallInfo->calltype = sat_setup_call_info->command_qualifier; + SatSetupCallIndCallInfo->dispText.stringLen = strlen(sat_setup_call_info->disp_text); + memcpy(SatSetupCallIndCallInfo->dispText.string, sat_setup_call_info->disp_text, strlen(sat_setup_call_info->disp_text)); + + SatSetupCallIndCallInfo->callNumber.stringLen = strlen(sat_setup_call_info->call_num); + memcpy(SatSetupCallIndCallInfo->callNumber.string, sat_setup_call_info->call_num, strlen(sat_setup_call_info->call_num)); + + SatSetupCallIndCallInfo->duration = sat_setup_call_info->duration; + + _vc_core_engine_handle_sat_events_cb(SatSetupCallIndCallInfo, NULL); + + if (SatSetupCallIndCallInfo) { + free(SatSetupCallIndCallInfo); + SatSetupCallIndCallInfo = NULL; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "End.."); + + return TRUE; +} + +/** + * This function processed incoming call + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] +*/ +gboolean voicecall_core_process_incoming_call(call_vc_core_incoming_info_t *incoming_call_info) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ""); + TelCallIncomingCallInfo_t *IncomingCallInfo = NULL; + + CALL_ENG_DEBUG(ENG_DEBUG, " number is : [%s]", incoming_call_info->call_num); + + IncomingCallInfo = (TelCallIncomingCallInfo_t *) malloc(sizeof(TelCallIncomingCallInfo_t)); + if (NULL == IncomingCallInfo) + return FALSE; + memset(IncomingCallInfo, 0, sizeof(IncomingCallInfo)); + + IncomingCallInfo->CallHandle = incoming_call_info->call_handle; + IncomingCallInfo->CallType = incoming_call_info->call_type; + IncomingCallInfo->CliPresentationIndicator = incoming_call_info->cli_presentation_indicator; + _vc_core_util_strcpy(IncomingCallInfo->szCallingPartyNumber, sizeof(IncomingCallInfo->szCallingPartyNumber), incoming_call_info->call_num); + IncomingCallInfo->CallingNameInfo.NameMode = incoming_call_info->calling_name_mode; + _vc_core_util_strcpy(IncomingCallInfo->CallingNameInfo.szNameData, sizeof(IncomingCallInfo->CallingNameInfo.szNameData), incoming_call_info->calling_name); + _vc_core_util_strcpy(IncomingCallInfo->RedirectInfo.szRedirectedNumber, sizeof(IncomingCallInfo->RedirectInfo.szRedirectedNumber), incoming_call_info->redirected_number); + _vc_core_util_strcpy(IncomingCallInfo->RedirectInfo.szRedirectSubAddress, sizeof(IncomingCallInfo->RedirectInfo.szRedirectSubAddress), incoming_call_info->redirected_sub_address); + IncomingCallInfo->CliCause = incoming_call_info->cli_cause; + IncomingCallInfo->fwded = incoming_call_info->bfwded; + IncomingCallInfo->ActiveLine = incoming_call_info->active_line; + + _vc_core_engine_handle_incoming_tapi_events(IncomingCallInfo, NULL); + + if (IncomingCallInfo) { + free(IncomingCallInfo); + IncomingCallInfo = NULL; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "End.."); + + return TRUE; +} + +/** + * This function answers an incoming call + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] +*/ +gboolean voicecall_core_answer_call(call_vc_core_state_t *pcall_core, gboolean auto_accept) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + gboolean active_calls = FALSE; + gboolean held_calls = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + /*First Stop the Incoming alert */ + voicecall_snd_stop_alert(pcall_core->papp_snd); + + _vc_core_engine_status_isexists_any_call(pcall_engine, &active_calls, &held_calls); + CALL_ENG_DEBUG(ENG_DEBUG, "active_calls=%d, held_calls=%d", active_calls, held_calls); + + if (TRUE == active_calls && TRUE == held_calls) { + /* Both Active and held calls available, so show Accept Call Choice Box */ + vc_engine_accept_choice_box_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + event_data.choice = VC_CALL_ACCEPT_2; + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_ACCEPT_CHOICE_BOX_TO_UI, (void *)&event_data); + + return TRUE; + } else if (TRUE == active_calls) { + /*If Auto Accpet is FALSE, show popup for manual accept */ + if (FALSE == auto_accept) { + /* Active calls available, so show Accept Call Choice Box */ + vc_engine_accept_choice_box_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + event_data.choice = VC_CALL_ACCEPT_1; + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_ACCEPT_CHOICE_BOX_TO_UI, (void *)&event_data); + } else { + voicecall_core_answer_call_bytype(pcall_core, VC_ANSWER_HOLD_ACTIVE_AND_ACCEPT); + } + return TRUE; + } else if (TRUE == held_calls) { + /* vcui_app_view_mtcall_destroy(papp_document); */ + } + + /* Normal Call Scenario */ + voicecall_core_answer_call_bytype(pcall_core, VC_ANSWER_NORMAL); + + return TRUE; +} + +/** + * This function answers an incoming call according to the given type + * + * @return Returns TRUE -if answer is sucess, FALSE - otherwise + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_answer_call_bytype(call_vc_core_state_t *pcall_core, voicecall_answer_type_t answer_type) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + voicecall_error_t error_code = ERROR_VOICECALL_NONE; + + CALL_ENG_DEBUG(ENG_DEBUG, "answer type: %d", answer_type); + + /*First Stop the Incoming alert */ + voicecall_snd_stop_alert(pcall_core->papp_snd); + + error_code = _vc_core_engine_answer_call(pcall_engine, answer_type); + + if (ERROR_VOICECALL_NONE != error_code) { + CALL_ENG_DEBUG(ENG_ERR, "_vc_core_engine_answer_call Failed : %d", error_code); + return FALSE; + } + + return TRUE; +} + +/** +* This function rejects an incoming call +* +* @return Returns TRUE on success or FALSE on failure +* @param[in] pcall_core Handle to voicecall core +* @param[in] bUDUB TRUE - set UDUB, FALSE - reject call +*/ +gboolean voicecall_core_reject_mt(call_vc_core_state_t *pcall_core, gboolean bUDUB) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + voicecall_snd_mgr_t *papp_snd = pcall_core->papp_snd; + + voicecall_error_t error_code = ERROR_VOICECALL_NONE; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + /*Incoming call rejected, reset the accept by flag */ + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT, FALSE); + + /* Stop Incmoing Call Alert */ + voicecall_snd_stop_alert(papp_snd); + + CALL_ENG_DEBUG(ENG_DEBUG, "bUDUB = %d", bUDUB); + error_code = _vc_core_engine_reject_call(pcall_engine, bUDUB); + + if (ERROR_VOICECALL_NONE != error_code) { + CALL_ENG_DEBUG(ENG_ERR, "_vc_core_engine_reject_call Failed, error_code = %ud", error_code); + return FALSE; + } + + return TRUE; + +} + +/** + * This function ends the call by state + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_end_call(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + return (ERROR_VOICECALL_NONE == _vc_core_engine_end_call(pcall_engine, VC_END_ACTIVE_OR_HELD_CALLS)) ? TRUE : FALSE; +} + +/** + * This function ends the call corresponding to the given call handle + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] call_handle handle of the call to be ended + */ +gboolean voicecall_core_end_call_by_handle(call_vc_core_state_t *pcall_core, int call_handle) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + return (ERROR_VOICECALL_NONE == _vc_core_engine_end_call_byhandle(pcall_engine, call_handle)) ? TRUE : FALSE; +} + +/** + * This function ends all available calls + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_end_all_calls(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + return (ERROR_VOICECALL_NONE == _vc_core_engine_end_call(pcall_engine, VC_END_ALL_CALLS)) ? TRUE : FALSE; +} + +/** + * This function ends all available active calls + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_end_all_active_calls(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + return (ERROR_VOICECALL_NONE == _vc_core_engine_end_call(pcall_engine, VC_END_ALL_ACTIVE_CALLS)) ? TRUE : FALSE; +} + +/** + * This function ends all available held calls + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_end_all_held_calls(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + return (ERROR_VOICECALL_NONE == _vc_core_engine_end_call(pcall_engine, VC_END_ALL_HELD_CALLS)) ? TRUE : FALSE; +} + +/** + * This function cancel outgoing call + * + * @return Returns TRUE -if answer is sucess, FALSE - otherwise + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_cancel_call(call_vc_core_state_t *pcall_core) +{ + int io_state = 0; + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + voicecall_call_type_bysetup_t call_setup_by = VC_CALL_SETUP_BY_NORMAL; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + /*Get Call Setup by Information */ + call_setup_by = pcall_core->call_setup_info.call_setup_by; + + _vc_core_engine_status_get_engine_iostate(pcall_engine, &io_state); + + switch (io_state) { + case VC_INOUT_STATE_OUTGOING_WAIT_HOLD: + { + int call_handle = -1; + + if (VC_CALL_SETUP_BY_SAT == call_setup_by) { + _vc_core_engine_send_sat_response(pcall_engine, SAT_RQST_SETUP_CALL, CALL_VC_ME_CLEAR_DOWN_BEFORE_CONN); + } + + /* Clear the MO Call, since the call is not dialed yet */ + _vc_core_engine_status_get_call_handle_bytype(pcall_engine, VC_OUTGOING_CALL, &call_handle); + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_END, call_handle, NULL); + + __vc_core_set_auto_redial_count(pcall_core, 0); + voicecall_core_clear_mo_call(pcall_engine); + + _vc_core_engine_change_engine_iostate(pcall_engine, VC_INOUT_STATE_OUTGOING_ABORTED); + } + return TRUE; + + case VC_INOUT_STATE_OUTGOING_WAIT_ORIG: + case VC_INOUT_STATE_OUTGOING_WAIT_ALERT: + case VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED: + { + /*To retrieve the held call automatically once the mo call is ended, if held is call is available */ + _vc_core_engine_status_set_end_flag(pcall_engine, VC_RETREIVE_CALL_ON_MOCALL_END); + + /* release the call , since it is dialed and waiting for connecting */ + if (FALSE == voicecall_core_end_mo_call(pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "MO Call Release Failed"); + } else { + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_MOCALL_END_BY_USER, TRUE); + _vc_core_engine_change_engine_iostate(pcall_engine, VC_INOUT_STATE_OUTGOING_WAIT_RELEASE); + } + } + return TRUE; + + case VC_INOUT_STATE_OUTGOING_WAIT_RELEASE: + { + /*Call already released */ + CALL_ENG_DEBUG(ENG_DEBUG, "MO Call has been released already"); + } + return TRUE; + + case VC_INOUT_STATE_OUTGOING_SHOW_REDIALCAUSE: + case VC_INOUT_STATE_OUTGOING_ABORTED: + case VC_INOUT_STATE_OUTGOING_WAIT_REDIAL: + { + int call_handle = -1; + + if (VC_CALL_SETUP_BY_SAT == call_setup_by) { + _vc_core_engine_send_sat_response(pcall_engine, SAT_RQST_SETUP_CALL, CALL_VC_NETWORK_UNABLE_TO_PROCESS_COMMAND); + } + + /*Stop Signal Play */ + voicecall_snd_stop_signal(pcall_core->papp_snd); + + __voicecall_core_mocall_reset_engine_state(pcall_engine); + + _vc_core_engine_status_get_call_handle_bytype(pcall_engine, VC_OUTGOING_CALL, &call_handle); + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_END, call_handle, NULL); + + __vc_core_set_auto_redial_count(pcall_core, 0); + voicecall_core_clear_mo_call(pcall_engine); + + } + return TRUE; + + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Action not defined for this IO State: %d", io_state); + break; + } + + return FALSE; +} + +/** + * This function process hold/retrive/swap conntected call + * + * @return Returns TRUE -if answer is sucess, FALSE - otherwise + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_process_hold_call(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + gboolean active_calls = FALSE; + gboolean held_calls = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + if (TRUE == voicecall_core_get_status(pcall_core, CALL_VC_CORE_FLAG_SOS_CALL_ONLY)) { + CALL_ENG_DEBUG(ENG_DEBUG, "SOS Call... Ignore this button..."); + return TRUE; + } + + if (FALSE == voicecall_core_is_incall_request_possible(pcall_engine)) { + return TRUE; + } + + voicecall_core_is_call_exists(pcall_engine, &active_calls, &held_calls); + CALL_ENG_DEBUG(ENG_DEBUG, "active calls: %d, held calls: %d", active_calls, held_calls); + + if (active_calls && held_calls) { + /*Both Calls available, swap the calls */ + if (FALSE == voicecall_core_swap_calls(pcall_engine)) { + return FALSE; + } + } else if (active_calls) { + /*Only activa call available, hold the call */ + if (FALSE == voicecall_core_hold_call(pcall_engine)) { + return FALSE; + } + } else if (held_calls) { + /*Only Held call available, retrieve the call */ + if (FALSE == voicecall_core_retrieve_call(pcall_engine)) { + return FALSE; + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "no call exists!"); + return FALSE; + } + + return TRUE; +} + +/** + * This function sets up a conference call + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_setup_conference(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + PRINT_CURRENT_TIME("Setup Conf Start at"); + return (ERROR_VOICECALL_NONE == _vc_core_engine_setup_conference(pcall_engine)) ? TRUE : FALSE; +} + +/** + * This function splits the call corressponding to the given call handle and makes a private call + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] call_handle Call to be splitted from the conference call + */ +gboolean voicecall_core_make_private_call(call_vc_core_state_t *pcall_core, int call_handle) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + PRINT_CURRENT_TIME("Split Conf Start at"); + return (ERROR_VOICECALL_NONE == _vc_core_engine_private_call(pcall_engine, call_handle)) ? TRUE : FALSE; +} + +/** + * This function transfers the call from active call to the held call + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_transfer_calls(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + return (ERROR_VOICECALL_NONE == _vc_core_engine_transfer_calls(pcall_engine)) ? TRUE : FALSE; +} + +/** + * This function sends a dtmf string + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] dtmf_string dtmf string to be sent + */ +gboolean voicecall_core_send_dtmf(call_vc_core_state_t *pcall_core, char *dtmf_string) +{ + voicecall_error_t error_code = ERROR_VOICECALL_NONE; + CALL_ENG_DEBUG(ENG_DEBUG, "dtmf string: %s", dtmf_string); + + pcall_core->bdtmf_queue = FALSE; + error_code = _vc_core_engine_send_dtmf(pcall_core->pcall_engine, dtmf_string); + return (ERROR_VOICECALL_NONE == error_code) ? TRUE : FALSE; +} + +/** +* This function stops sound alert +* +* @return Returns TRUE on success or FALSE on failure +* @param[in] pcall_core Handle to voicecall core +*/ +gboolean voicecall_core_stop_alert(call_vc_core_state_t *pcall_core) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + /* Stop Incmoing Call Alert */ + voicecall_snd_stop_alert(pcall_core->papp_snd); + + return TRUE; +} + +inline gboolean voicecall_core_get_mo_call_handle(call_vc_core_state_t *pcall_core, int *pcall_handle) +{ + *pcall_handle = -1; + return (ERROR_VOICECALL_NONE == _vc_core_engine_status_get_call_handle_bytype(pcall_core->pcall_engine, VC_OUTGOING_CALL, pcall_handle)) ? TRUE : FALSE; +} + +inline int voicecall_core_get_auto_redial_count(call_vc_core_state_t *pcall_core) +{ + return pcall_core->auto_redial_count; +} + +void __vc_core_set_auto_redial_count(call_vc_core_state_t *pcall_core, int auto_redial_count) +{ + pcall_core->auto_redial_count = auto_redial_count; +} + +gboolean voicecall_core_start_redial(call_vc_core_state_t *pcall_core, int manual_redial) +{ + int auto_redial_status = FALSE; + int redial_count = 1; + int call_handle = -1; + int total_call_member = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + if (vconf_get_bool(VCONFKEY_CISSAPPL_VOICE_AUTO_REDIAL_BOOL, &auto_redial_status)) { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_bool failed."); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "auto_redial_status:[%d]", auto_redial_status); + + redial_count = voicecall_core_get_auto_redial_count(pcall_core); + + redial_count++; + + /* + bmanual_redial == TRUE : Redial is made by User, No need to check the auto redial status and count + auto_redial_status == 1: Auto Redial for GCF case, auto redial count must be checked + */ + if ((1 == manual_redial) || ((auto_redial_status == 1) && (redial_count < MO_REDIAL_COUNT_MAX))) { + CALL_ENG_DEBUG(ENG_DEBUG, "redial_count = %d", redial_count); + + /*Start Redial Timer */ + if (1 == redial_count) { + CALL_ENG_DEBUG(ENG_DEBUG, "MO_REDIAL_TIMER_INTERVAL_FIRST"); + pcall_core->mo_redial_timer = g_timeout_add(MO_REDIAL_TIMER_INTERVAL_FIRST, mo_redial_timer_cb, pcall_core); + } else if ((redial_count > 1) && (redial_count < 5)) { + CALL_ENG_DEBUG(ENG_DEBUG, "MO_REDIAL_TIMER_INTERVAL_SECOND"); + pcall_core->mo_redial_timer = g_timeout_add(MO_REDIAL_TIMER_INTERVAL_SECOND, mo_redial_timer_cb, pcall_core); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "MO_REDIAL_TIMER_INTERVAL_THIRD"); + pcall_core->mo_redial_timer = g_timeout_add(MO_REDIAL_TIMER_INTERVAL_THIRD, mo_redial_timer_cb, pcall_core); + } + + voicecall_core_change_engine_state(pcall_core->pcall_engine, VC_INOUT_STATE_OUTGOING_WAIT_REDIAL); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "You dont need to redial close the MO Call Things"); + + voicecall_snd_change_mm_path(pcall_core->papp_snd, VOICE_CALL_MM_RESET); + + /* __vcui_app_view_mo_canceltimer_cb() */ + _vc_core_engine_status_get_call_handle_bytype(pcall_core->pcall_engine, VC_OUTGOING_CALL, &call_handle); + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_END, call_handle, NULL); + + __vc_core_set_auto_redial_count(pcall_core, 0); + voicecall_core_clear_mo_call(pcall_core->pcall_engine); + + __voicecall_core_mocall_reset_engine_state(pcall_core->pcall_engine); + + voicecall_core_get_total_call_member(pcall_core->pcall_engine, &total_call_member); + + voicecall_snd_stop_signal(pcall_core->papp_snd); + + /* If No Connected Calls End the UI */ + if (total_call_member == 0) { + /*Reset voice call core to default values */ + voicecall_core_set_to_default(pcall_core); + } else { + voicecall_snd_change_path(pcall_core->papp_snd); + } + + } + + return TRUE; +} + +inline gboolean voicecall_core_prepare_redial(call_vc_core_state_t *pcall_core, int call_handle) +{ + voicecall_error_t error_code = ERROR_VOICECALL_NONE; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + error_code = _vc_core_engine_prepare_redial(pcall_core->pcall_engine, call_handle); + + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_engine_prepare_redial returned : %d", error_code); + + return (ERROR_VOICECALL_NONE == error_code) ? TRUE : FALSE; +} + +gboolean mo_redial_timer_cb(void *data) +{ + int call_handle = -1; + int redial_count; + + CALL_ENG_DEBUG(ENG_DEBUG, "mo_redial_timer_cb"); + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)data; + voicecall_core_get_mo_call_handle(pcall_core, &call_handle); + CALL_ENG_DEBUG(ENG_DEBUG, "call handle is %d", call_handle); + + redial_count = voicecall_core_get_auto_redial_count(pcall_core); + redial_count++; + __vc_core_set_auto_redial_count(pcall_core, redial_count); + + CALL_ENG_DEBUG(ENG_DEBUG, "redial_count:[%d]", redial_count); + + voicecall_core_prepare_redial(pcall_core, call_handle); + CALL_ENG_DEBUG(ENG_DEBUG, "voicecall_core_prepare_redial done."); + + voicecall_core_make_call(pcall_core); + return FALSE; +} + +gboolean voicecall_core_stop_redial(call_vc_core_state_t *pcall_core) +{ + int call_handle = -1, total_call_member = -1; + + CALL_ENG_DEBUG(ENG_DEBUG, "coming inside voicecall_core_stop_redial"); + + voicecall_snd_change_mm_path(pcall_core->papp_snd, VOICE_CALL_MM_RESET); + _vc_core_util_set_call_status(VCONFKEY_CALL_OFF); + + /*Cancel the Redial Timer */ + if (pcall_core->mo_redial_timer != -1) { + CALL_ENG_DEBUG(ENG_DEBUG, "mo_redial_timer removing.."); + g_source_remove(pcall_core->mo_redial_timer); + pcall_core->mo_redial_timer = -1; + } + + /* __vcui_app_view_mo_canceltimer_cb() */ + _vc_core_engine_status_get_call_handle_bytype(pcall_core->pcall_engine, VC_OUTGOING_CALL, &call_handle); + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_CALL_END, call_handle, NULL); + + __vc_core_set_auto_redial_count(pcall_core, 0); + voicecall_core_clear_mo_call(pcall_core->pcall_engine); + + __voicecall_core_mocall_reset_engine_state(pcall_core->pcall_engine); + + voicecall_core_get_total_call_member(pcall_core->pcall_engine, &total_call_member); + + voicecall_snd_stop_signal(pcall_core->papp_snd); + + /* If No Connected Calls End the UI */ + if (total_call_member == 0) { + /*Reset voice call core to default values */ + voicecall_core_set_to_default(pcall_core); + } else { + voicecall_snd_change_path(pcall_core->papp_snd); + } + return TRUE; + +} + +static gboolean __voicecall_core_auto_answer_timer_cb(gpointer puser_data) +{ + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)puser_data; + + if (pcall_core->auto_answer_timer > 0) { + g_source_remove(pcall_core->auto_answer_timer); + pcall_core->auto_answer_timer = 0; + } + + /*Check for Incoming call and then answer the call */ + if (TRUE == voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Call Answered"); + voicecall_core_answer_call(pcall_core, TRUE); + } + + return FALSE; +} + +static gboolean __voicecall_core_callstatus_set_timer_cb(gpointer puser_data) +{ + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)puser_data; + + if (pcall_core->callstatus_timer > 0) { + g_source_remove(pcall_core->callstatus_timer); + pcall_core->callstatus_timer = 0; + } + + _vc_core_util_set_call_status(VCONFKEY_CALL_VOICE_CONNECTING); + + return FALSE; +} + +static gboolean __voicecall_core_auto_answer_idle_cb(gpointer puser_data) +{ + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)puser_data; + int engine_state = 0; + int auto_answer_time = 0, ret = -1; + unsigned long auto_answer_time_interval = 0; + + _vc_core_engine_status_get_engine_iostate(pcall_core->pcall_engine, &engine_state); + CALL_ENG_DEBUG(ENG_DEBUG, "eng_state : %d", engine_state); + if (engine_state != VC_INOUT_STATE_INCOME_BOX) { + CALL_ENG_DEBUG(ENG_DEBUG, "Engine State not in Income Box, Current State: %d", engine_state); + return FALSE; + } + /* Read the time interval from gconf and set the redial timer */ + ret = vconf_get_int(VCONFKEY_CISSAPPL_ANSWERING_MODE_TIME_INT, &auto_answer_time); + if (0 == ret) { + auto_answer_time_interval = auto_answer_time * 1000; + CALL_ENG_DEBUG(ENG_DEBUG, "The time interval is : %ld", auto_answer_time_interval); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "vconf_get_int FAILED"); + return FALSE; + } + + pcall_core->auto_answer_timer = g_timeout_add(auto_answer_time_interval, __voicecall_core_auto_answer_timer_cb, pcall_core); + return FALSE; +} + +/** +* This function checks BT headset and Earjack status +* +* @return void +* @param[in] pcall_core Handle to voicecall core +*/ +static void __voicecall_core_check_headset_earjack_status(call_vc_core_state_t *pcall_core) +{ + gboolean bt_connected = FALSE; + + bt_connected = _vc_bt_get_bt_status(); + CALL_ENG_DEBUG(ENG_DEBUG, "Bt connected =%d", bt_connected); + + pcall_core->bt_connected = bt_connected; +#ifdef _NEW_SND_ +#else + voicecall_snd_set_status(pcall_core->papp_snd, VOICE_CALL_AUDIO_HEADSET, bt_connected); +#endif + + CALL_ENG_DEBUG(ENG_DEBUG, "Update the earjack status"); + _voicecall_dvc_get_earjack_status(pcall_core); +} + +/** + * This function parses the in call supplementary services string and returns the in call ss to be used + * + * @return Returns in call ss state #vcui_app_incall_ss_state_t + * @param[in] pcall_core Handle to voicecall core + * @param[in] number number to be parsed + */ +call_vc_core_incall_ss_state_t voicecall_core_parse_incall_ss_string(call_vc_core_state_t *pcall_core, char *number) +{ + call_vc_core_incall_ss_state_t ss_value = CALL_VC_CORE_SS_USSD; + + if (strlen(number) == 1) { + switch (number[0]) { + case '0': + ss_value = CALL_VC_CORE_SS_0; + break; + case '1': + ss_value = CALL_VC_CORE_SS_1; + break; + case '2': + ss_value = CALL_VC_CORE_SS_2; + break; + case '3': + ss_value = CALL_VC_CORE_SS_3; + break; + case '4': + ss_value = CALL_VC_CORE_SS_4; + break; + default: + ss_value = CALL_VC_CORE_SS_USSD; + break; + } + } else if (strlen(number) == 2) { + if ((number[0] == '1') && (number[1] > '0') && (number[1] < '8')) { + pcall_core->selected_call_id_in_ss = atoi(number + 1); + ss_value = CALL_VC_CORE_SS_1X; + } + + if ((number[0] == '2') && (number[1] > '0') && (number[1] < '8')) { + pcall_core->selected_call_id_in_ss = atoi(number + 1); + ss_value = CALL_VC_CORE_SS_2X; + } + } + CALL_ENG_DEBUG(ENG_DEBUG, "ss parsed value: %d", ss_value); + return ss_value; +} + +/** + * This function starts the supplementary services while on call + * + * @return Returns TRUE If transfer call can be made or FALSE if not + * @param[in] pcall_core Handle to voicecall core + * @param[in] incall_ss_state state of the In Call Supplementary Service + */ +gboolean voicecall_core_start_incall_ss(call_vc_core_state_t *pcall_core, call_vc_core_incall_ss_state_t incall_ss_state) +{ + gboolean active_calls = FALSE, held_calls = FALSE; + + _vc_core_engine_status_isexists_any_call(pcall_core->pcall_engine, &active_calls, &held_calls); + + CALL_ENG_DEBUG(ENG_DEBUG, "ss state = %d", incall_ss_state); + vc_engine_msg_box_type event_data; + memset(&event_data, 0, sizeof(event_data)); + event_data.string_id = IDS_CALL_POP_OPERATION_REFUSED; + + /*Cancel DTMF Sending if any and close the dtmf ui */ + /* vcui_app_doc_cancel_dtmf_queue(papp_document); sathwick TBD */ + + switch (incall_ss_state) { + /* Releases all held calls or Set UDUB(User Determined User Busy) for a waiting call */ + case CALL_VC_CORE_SS_0: + { + /* if an incoming call is activated, reject the incoming all */ + if (TRUE == voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + voicecall_core_reject_mt(pcall_core, TRUE); + return TRUE; + } else if (held_calls) { + voicecall_core_end_all_held_calls(pcall_core); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "There are no held calls to do the processing"); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + } + } + break; + case CALL_VC_CORE_SS_1: + { + if (voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + /* Accept incoming call */ + voicecall_core_answer_call_bytype(pcall_core, VC_ANSWER_RELEASE_ACTIVE_AND_ACCEPT); + return TRUE; + } else if (voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine)) { + /* This fucntion checks for held calls to be retreived on response of ending call */ + voicecall_core_set_check_ss_on_end(pcall_core); + voicecall_core_end_mo_call(pcall_core->pcall_engine); + } else if (active_calls) { + voicecall_core_end_all_active_calls(pcall_core); + voicecall_core_set_check_ss_on_end(pcall_core); + } else if (held_calls) { + _vc_core_engine_retrieve_call(pcall_core->pcall_engine); + } else { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + } + break; + case CALL_VC_CORE_SS_1X: + { + if (voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } else if (active_calls) { + + if (!(ERROR_VOICECALL_NONE == _vc_core_engine_end_call_bycallId(pcall_core->pcall_engine, pcall_core->selected_call_id_in_ss))) { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + } else { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + } + break; + case CALL_VC_CORE_SS_2: + { + + if (voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + if (active_calls && held_calls) { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } else { +#ifdef _CPHS_DEFINED_ /* Not used currently */ + if (TRUE == active_calls && (voicecall_core_get_cphs_csp_status(pcall_core->pcall_engine, VC_CPHS_CSP_HOLD))) { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + break; + } +#endif + voicecall_core_answer_call(pcall_core, TRUE); + } + } else if (voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine)) { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } else if (active_calls && held_calls) { + _vc_core_engine_swap_calls(pcall_core->pcall_engine); + } else if (active_calls) { + _vc_core_engine_hold_call(pcall_core->pcall_engine); + } else if (held_calls) { + _vc_core_engine_retrieve_call(pcall_core->pcall_engine); + } else { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + } + break; + case CALL_VC_CORE_SS_2X: + { + if (voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine) || voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine)) { + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + } else if (TRUE == active_calls && FALSE == held_calls) { + int active_members = 0; + + voicecall_core_get_active_call_member(pcall_core, &active_members); + + if (!(active_members > 1 && (ERROR_VOICECALL_NONE == _vc_core_engine_private_call_by_callid(pcall_core->pcall_engine, pcall_core->selected_call_id_in_ss)))) { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + } else { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + } + break; + case CALL_VC_CORE_SS_3: + { + if (TRUE == voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + return TRUE; + } + + if (TRUE == voicecall_core_is_conf_call_possible(pcall_core)) { + _vc_core_engine_setup_conference(pcall_core->pcall_engine); + } else { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + } + break; + case CALL_VC_CORE_SS_4: + if (TRUE == voicecall_core_is_transfer_call_possible(pcall_core)) { + if (FALSE == voicecall_core_transfer_calls(pcall_core)) { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + } else { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + /* + if ( !(vcui_app_doc_is_transfer_call_possible(papp_document) && TRUE == vcui_app_doc_transfer_calls(papp_document)) ) + { + vcui_app_msgbox(papp_document, vcui_app_rsr_load_string(IDS_CALL_POP_OPERATION_REFUSED),GTK_MESSAGE_ALERT); + } + */ + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Invalid SS State"); + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + return TRUE; +} + +/** + * This function processed the supplementary services while on call + * + * @return Returns TRUE If transfer call can be made or FALSE if not + * @param[in] pcall_core Handle to voicecall core + * @param[in] pdialled_number dial number + */ +void voicecall_core_process_incall_ss(call_vc_core_state_t *pcall_core, char *pdialled_number) +{ + call_vc_core_incall_ss_state_t incall_ss_state = CALL_VC_CORE_SS_NONE; + + CALL_ENG_DEBUG(ENG_DEBUG, " .."); + + incall_ss_state = voicecall_core_parse_incall_ss_string(pcall_core, pdialled_number); + + if (incall_ss_state != CALL_VC_CORE_SS_USSD) { + voicecall_core_start_incall_ss(pcall_core, incall_ss_state); + } else { + + CALL_ENG_DEBUG(ENG_DEBUG, "Involves CISS functionality so need for us to handle and will be handled by CISS"); + vc_engine_msg_box_type event_data; + memset(&event_data, 0, sizeof(event_data)); + event_data.string_id = IDS_CALL_POP_OPERATION_REFUSED; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } +} + +#ifdef PDIAL_SEND_DTMF +gboolean voicecall_core_send_phone_number_dtmf(gpointer puser_data) +{ + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)vcall_engine_get_core_state(); + int call_handle = (int)puser_data; + char dtmf_number[VC_PHONE_NUMBER_LENGTH_MAX]; + call_vc_call_objectinfo_t obj_info = { 0, }; + + CALL_ENG_DEBUG(ENG_DEBUG, "inside ..."); + + if (TRUE == _vc_core_cm_get_call_object(&pcall_core->pcall_engine->call_manager, call_handle, &obj_info)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Source telephone number - %s", obj_info.source_tel_number); + if (TRUE == _vc_core_util_extract_dtmf_number(obj_info.source_tel_number, dtmf_number, sizeof(dtmf_number))) { + CALL_ENG_DEBUG(ENG_DEBUG, "DTMF number - %s", dtmf_number); + if (VC_CALL_ORIG_TYPE_SAT == pcall_core->call_setup_info.call_type) { + __voicecall_core_queue_dtmf_string(pcall_core, dtmf_number, TRUE); + } else { + __voicecall_core_queue_dtmf_string(pcall_core, dtmf_number, FALSE); + } + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Call Info not available for call handle: %d", call_handle); + } + + return FALSE; +} + +/** + * This function cancels the dtmf queue + * + * @return TRUE - sucess, FALSE otherwise + * @param[in] papp_document Handle to Application Document + */ +gboolean voicecall_core_cancel_dtmf_queue(call_vc_core_state_t *pcall_core) +{ + voicecall_dtmf_info_t *pdtmf_info = (voicecall_dtmf_info_t *)&pcall_core->dtmf_info; + + CALL_ENG_DEBUG(ENG_DEBUG, "Start:pcall_core(%p)", pcall_core); + + if (FALSE == pdtmf_info->bdtmf_queue) { + return TRUE; + } + + /*Remove Pauser Timer */ + g_source_remove(pdtmf_info->dtmf_pause_timer); + pdtmf_info->dtmf_pause_timer = -1; + + /*Reset the Status Flags */ + pdtmf_info->bdtmf_queue = FALSE; + pdtmf_info->dtmf_index = 0; + memset(pdtmf_info->dtmf_number, 0, sizeof(pdtmf_info->dtmf_number)); + if (TRUE == pdtmf_info->bsat_dtmf) { + voicecall_core_send_sat_response(pcall_core->pcall_engine, SAT_RQST_SEND_DTMF, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + } + pdtmf_info->bsat_dtmf = FALSE; + pdtmf_info->bsat_hidden = FALSE; + CALL_ENG_DEBUG(ENG_DEBUG, "End"); + return TRUE; +} + +static gboolean __voicecall_core_dtmf_pause_timer_cb(gpointer puser_data) +{ + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)puser_data; + + __voicecall_core_handle_dtmf_ack(pcall_core, TRUE); + + /*Always return FALSE, so that it won't be called again */ + return FALSE; +} + +gboolean __voicecall_core_send_dtmf_idle_cb(gpointer pdata) +{ + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)pdata; + voicecall_dtmf_info_t *pdtmf_info = (voicecall_dtmf_info_t *)&pcall_core->dtmf_info; + voicecall_error_t vc_error; + vc_engine_dtmf_ack_type event_data; + char dtmf_string[2]; + + dtmf_string[0] = pdtmf_info->dtmf_number[pdtmf_info->dtmf_index]; + dtmf_string[1] = '\0'; + + CALL_ENG_DEBUG(ENG_DEBUG, "inside ..."); + + vc_error = _vc_core_engine_send_dtmf(pcall_core->pcall_engine, dtmf_string); + + if (vc_error == ERROR_VOICECALL_INVALID_DTMF_CHAR) { + CALL_ENG_DEBUG(ENG_DEBUG, "ERROR_VOICECALL_INVALID_DTMF_CHAR"); + } else if (ERROR_VOICECALL_NONE != vc_error) { + voicecall_core_cancel_dtmf_queue(pcall_core); + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = FALSE; + event_data.string_id = -1; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_DTMF_ACK_TO_UI, (void *)&event_data); + + if (TRUE == pdtmf_info->bsat_dtmf) { + voicecall_core_send_sat_response(pcall_core->pcall_engine, SAT_RQST_SEND_DTMF, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + } + + if (!((TRUE == pdtmf_info->bsat_dtmf) && (TRUE == pdtmf_info->bsat_hidden))) { + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = FALSE; + event_data.string_id = IDS_CALL_POP_DTMFSENDING_FAIL; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_DTMF_ACK_TO_UI, (void *)&event_data); + } + } + + return FALSE; +} + +static gboolean __voicecall_core_handle_dtmf_ack(call_vc_core_state_t *pcall_core, gboolean success) +{ + voicecall_dtmf_info_t *pdtmf_info = (voicecall_dtmf_info_t *)&pcall_core->dtmf_info; + vc_engine_dtmf_ack_type event_data; + CALL_ENG_DEBUG(ENG_DEBUG, "..."); + + if (FALSE == pdtmf_info->bdtmf_queue) { + CALL_ENG_DEBUG(ENG_DEBUG, "DTMF Queue Canceled, do nothing"); + return TRUE; + } + + if (TRUE == success) { + char dtmf_string[2]; + pdtmf_info->dtmf_index++; + + dtmf_string[0] = pdtmf_info->dtmf_number[pdtmf_info->dtmf_index]; + dtmf_string[1] = '\0'; + + CALL_ENG_DEBUG(ENG_DEBUG, "Current dtmf_index: %d,dtmf_max_length=%d", pdtmf_info->dtmf_index, pdtmf_info->dtmf_max_length); + CALL_ENG_DEBUG(ENG_DEBUG, "Current DTMF String: %s", &pdtmf_info->dtmf_number[pdtmf_info->dtmf_index]); + + /*Update the DTMF Sending UI only, if it is available */ + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = TRUE; + event_data.string_id = IDS_CALL_POP_SENDING; + snprintf(event_data.display_string, sizeof(event_data.display_string), &pdtmf_info->dtmf_number[pdtmf_info->dtmf_index]); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_DTMF_ACK_TO_UI, (void *)&event_data); + + /*Find the End of the queue */ + if (pdtmf_info->dtmf_index >= pdtmf_info->dtmf_max_length) { + + CALL_ENG_DEBUG(ENG_DEBUG, "Updating DTMF Progress before destroying"); + + if (!((TRUE == pdtmf_info->bsat_dtmf) && (TRUE == pdtmf_info->bsat_hidden))) { + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = FALSE; + event_data.string_id = IDS_CALL_POP_DTMF_SENT; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_DTMF_ACK_TO_UI, (void *)&event_data); + } + + if (TRUE == pdtmf_info->bsat_dtmf) { + voicecall_core_send_sat_response(pcall_core->pcall_engine, SAT_RQST_SEND_DTMF, CALL_VC_ME_RET_SUCCESS); + } + } else { + if (0 == strcasecmp(dtmf_string, "p")) { + int dtmf_interval = 0; + + if (FALSE == _vc_core_util_check_gcf_status()) { + dtmf_interval = (pdtmf_info->dtmf_index == 0) ? DTMF_PAUSE_TIMER_INTERVAL_FIRST : DTMF_PAUSE_TIMER_INTERVAL_REST; + } else { +#ifdef GCONF_GCF_SAT_TEST + int start_interval = DTMF_PAUSE_TIMER_INTERVAL_GCF_FIRST; + int rest_interval = DTMF_PAUSE_TIMER_INTERVAL_GCF_REST; + { + GConfClient *client = NULL; + client = gconf_client_get_default(); + if (NULL == client) { + CALL_ENG_DEBUG(ENG_DEBUG, "gconf_client_get_default failed.."); + } else { + + start_interval = gconf_client_get_int(client, PATH_DTMF_INTERVAL_GCF_FIRST, NULL); + + rest_interval = gconf_client_get_int(client, PATH_DTMF_INTERVAL_GCF_REST, NULL); + g_object_unref(client); + } + + } + CALL_ENG_DEBUG(ENG_DEBUG, "start_interval:%d, rest_interval = %d", start_interval, rest_interval); + dtmf_interval = (pdtmf_info->dtmf_index == 0) ? start_interval : rest_interval; +#else + dtmf_interval = (pdtmf_info->dtmf_index == 0) ? DTMF_PAUSE_TIMER_INTERVAL_GCF_FIRST : DTMF_PAUSE_TIMER_INTERVAL_GCF_REST; +#endif + CALL_ENG_DEBUG(ENG_DEBUG, "dtmf_interval:%d", dtmf_interval); + } + pdtmf_info->dtmf_pause_timer = g_timeout_add(dtmf_interval, __voicecall_core_dtmf_pause_timer_cb, pcall_core); + } else { + g_idle_add_full(G_PRIORITY_HIGH_IDLE + 25, __voicecall_core_send_dtmf_idle_cb, pcall_core, NULL); + } + } + } else { + voicecall_core_cancel_dtmf_queue(pcall_core); + + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = FALSE; + event_data.string_id = IDS_CALL_POP_DTMFSENDING_FAIL; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_DTMF_ACK_TO_UI, (void *)&event_data); + } + + return TRUE; +} + +/** + * This function queues the dtmf digits one by one from the given dtmf string + * + * @return TRUE - sucess, FALSE otherwise + * @param[in] papp_document Handle to Application Document + * @param[in] dtmf_string dtmf string to be queued + */ +static gboolean __voicecall_core_queue_dtmf_string(call_vc_core_state_t *pcall_core, char *dtmf_string, gboolean bsat_dtmf) +{ + voicecall_dtmf_info_t *pdtmf_info = (voicecall_dtmf_info_t *)&pcall_core->dtmf_info; + gboolean bhidden_mode = FALSE; + char dtmf_digit[2]; + vc_engine_dtmf_ack_type event_data; + + CALL_ENG_DEBUG(ENG_DEBUG, "bsat_dtmf = %d", bsat_dtmf); + + if (TRUE == bsat_dtmf) { + /*Always get the status from the engine */ + _vc_core_engine_get_sat_dtmf_hidden_mode(pcall_core->pcall_engine, &bhidden_mode); + CALL_ENG_DEBUG(ENG_DEBUG, "SAT Hidden Mode : %d", bhidden_mode); + } + + /*Check for the validity of the DTMF String */ + if (FALSE == _vc_core_util_isvalid_full_dtmf_number(dtmf_string)) { + if (TRUE == bsat_dtmf) { + voicecall_core_send_sat_response(pcall_core->pcall_engine, SAT_RQST_SEND_DTMF, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + } + + if (!((TRUE == bsat_dtmf) && (TRUE == bhidden_mode))) { + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = FALSE; + event_data.string_id = IDS_CALL_POP_INVALID_DTMF; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_DTMF_ACK_TO_UI, (void *)&event_data); + } + return FALSE; + } + + /*Reset DTMF Values */ + pdtmf_info->bdtmf_queue = FALSE; + pdtmf_info->dtmf_index = 0; + pdtmf_info->bsat_dtmf = bsat_dtmf; + + if (TRUE == bsat_dtmf) { + /*Initialize */ + pdtmf_info->bsat_hidden = bhidden_mode; + } + + /* Check: It takes only 40 characters from the source, rest of the characters are ignored */ + memset(pdtmf_info->dtmf_number, 0, sizeof(pdtmf_info->dtmf_number)); + if (1 < sizeof(pdtmf_info->dtmf_number)) + _vc_core_util_strcpy(pdtmf_info->dtmf_number, VC_PHONE_NUMBER_LENGTH_MAX, "P"); + + strncat(pdtmf_info->dtmf_number, dtmf_string, min((sizeof(pdtmf_info->dtmf_number) - 2), strlen(dtmf_string))); + + pdtmf_info->dtmf_max_length = strlen(pdtmf_info->dtmf_number); + + CALL_ENG_DEBUG(ENG_DEBUG, "Dtmf Number:%s ,dtmf_max_length:%d", pdtmf_info->dtmf_number, pdtmf_info->dtmf_max_length); + + dtmf_digit[0] = pdtmf_info->dtmf_number[pdtmf_info->dtmf_index]; + dtmf_digit[1] = '\0'; + + /*Send DTMF */ + if (0 == strcasecmp(dtmf_digit, "p")) { + int dtmf_interval = 0; + + if (FALSE == _vc_core_util_check_gcf_status()) { + dtmf_interval = (pdtmf_info->dtmf_index == 0) ? DTMF_PAUSE_TIMER_INTERVAL_FIRST : DTMF_PAUSE_TIMER_INTERVAL_REST; + } else { +#ifdef GCONF_GCF_SAT_TEST + int start_interval = DTMF_PAUSE_TIMER_INTERVAL_GCF_FIRST; + int rest_interval = DTMF_PAUSE_TIMER_INTERVAL_GCF_REST; + { + + GConfClient *client = NULL; + client = gconf_client_get_default(); + if (NULL == client) { + CALL_ENG_DEBUG(ENG_DEBUG, "gconf_client_get_default failed.."); + } else { + + start_interval = gconf_client_get_int(client, PATH_DTMF_INTERVAL_GCF_FIRST, NULL); + + rest_interval = gconf_client_get_int(client, PATH_DTMF_INTERVAL_GCF_REST, NULL); + g_object_unref(client); + } + + } + CALL_ENG_DEBUG(ENG_DEBUG, "start_interval:%d, rest_interval = %d", start_interval, rest_interval); + dtmf_interval = (pdtmf_info->dtmf_index == 0) ? start_interval : rest_interval; +#else + dtmf_interval = (pdtmf_info->dtmf_index == 0) ? DTMF_PAUSE_TIMER_INTERVAL_GCF_FIRST : DTMF_PAUSE_TIMER_INTERVAL_GCF_REST; +#endif + CALL_ENG_DEBUG(ENG_DEBUG, "updated dtmf_interval:%d", dtmf_interval); + } + pdtmf_info->dtmf_pause_timer = g_timeout_add(dtmf_interval, __voicecall_core_dtmf_pause_timer_cb, pcall_core); + } else if ((ERROR_VOICECALL_NONE != _vc_core_engine_send_dtmf(pcall_core->pcall_engine, dtmf_digit))) { + if (!((TRUE == pdtmf_info->bsat_dtmf) && (TRUE == pdtmf_info->bsat_hidden))) { + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = FALSE; + event_data.string_id = IDS_CALL_POP_DTMFSENDING_FAIL; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_DTMF_ACK_TO_UI, (void *)&event_data); + } + if (TRUE == pdtmf_info->bsat_dtmf) { + voicecall_core_send_sat_response(pcall_core->pcall_engine, SAT_RQST_SEND_DTMF, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + } + return FALSE; + } + pdtmf_info->bdtmf_queue = TRUE; + + /*Create Progressbar popup */ + if (!((TRUE == pdtmf_info->bsat_dtmf) && (TRUE == pdtmf_info->bsat_hidden))) { + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = TRUE; + event_data.string_id = IDS_CALL_POP_SENDING; + _vc_core_util_strcpy(event_data.display_string, VC_PHONE_NUMBER_LENGTH_MAX, pdtmf_info->dtmf_number); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_DTMF_ACK_TO_UI, (void *)&event_data); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "SAT DTMF Hidden Mode, not showing UI"); + } + return TRUE; +} +#endif + +gboolean voicecall_core_change_sound_path(call_vc_core_state_t *pcall_core, voicecall_snd_audio_type_t sound_path) +{ + voicecall_snd_mgr_t *papp_snd = pcall_core->papp_snd; + int ret = FALSE; + int total_call_member = -1; + + CALL_ENG_DEBUG(ENG_DEBUG, "sound_path:[%d]", sound_path); + + voicecall_core_get_total_call_member(pcall_core->pcall_engine, &total_call_member); + if (total_call_member == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "There are not active calls hence it should not work"); + return FALSE; + } + + switch (sound_path) { + case VOICE_CALL_AUDIO_SPEAKER: + { +#ifdef _NEW_SND_ + if (voicecall_snd_get_path_status(pcall_core->papp_snd) == VOICE_CALL_SND_PATH_BT) { + /*_vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_SWITCH_TO_PHONE, -1, NULL);*/ + _vc_bt_request_switch_headset_path(pcall_core, FALSE); + } + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_SPEAKER); +#else + if (TRUE == voicecall_snd_get_status(papp_snd, VOICE_CALL_AUDIO_HEADSET)) { + voicecall_snd_set_status(papp_snd, VOICE_CALL_AUDIO_HEADSET, FALSE); + /*_vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_SWITCH_TO_PHONE, -1, NULL);*/ + _vc_bt_request_switch_headset_path(pcall_core, FALSE); + } + + voicecall_snd_set_status(papp_snd, VOICE_CALL_AUDIO_SPEAKER, TRUE); +#endif + ret = TRUE; + } + break; + + case VOICE_CALL_AUDIO_HEADSET: + { +#ifdef _NEW_SND_ + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_BT); +#else + voicecall_snd_set_status(papp_snd, VOICE_CALL_AUDIO_SPEAKER, FALSE); + voicecall_snd_set_status(papp_snd, VOICE_CALL_AUDIO_HEADSET, TRUE); +#endif +/* _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_SWITCH_TO_HEADSET, -1, NULL);*/ + _vc_bt_request_switch_headset_path(pcall_core, TRUE); + + ret = TRUE; + } + break; + + case VOICE_CALL_AUDIO_EARJACK: + { +#ifdef _NEW_SND_ + if (voicecall_snd_get_path_status(pcall_core->papp_snd) == VOICE_CALL_SND_PATH_BT) { + /*_vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_SWITCH_TO_PHONE, -1, NULL);*/ + _vc_bt_request_switch_headset_path(pcall_core, FALSE); + } + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_EARJACK); +#else + voicecall_snd_set_status(papp_snd, VOICE_CALL_AUDIO_SPEAKER, FALSE); + + if (TRUE == voicecall_snd_get_status(papp_snd, VOICE_CALL_AUDIO_HEADSET)) { + voicecall_snd_set_status(papp_snd, VOICE_CALL_AUDIO_HEADSET, FALSE); + /*_vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_SWITCH_TO_PHONE, -1, NULL);*/ + _vc_bt_request_switch_headset_path(pcall_core, FALSE); + } +#endif + ret = TRUE; + } + break; + + default: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Unknown type!!"); + ret = FALSE; + } + break; + } + + /* Change Audio Path according to the current status */ + voicecall_snd_change_path(papp_snd); + + return ret; +} + +gboolean voicecall_core_get_sound_path(call_vc_core_state_t *pcall_core, int *sound_path) +{ + voicecall_snd_mgr_t *papp_snd = pcall_core->papp_snd; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + +#ifdef _NEW_SND_ + switch (voicecall_snd_get_path_status(papp_snd)) + { + case VOICE_CALL_SND_PATH_SPEAKER: + { + *sound_path = VOICE_CALL_AUDIO_SPEAKER; + } + break; + + case VOICE_CALL_SND_PATH_BT: + { + *sound_path = VOICE_CALL_AUDIO_HEADSET; + } + break; + + case VOICE_CALL_SND_PATH_EARJACK: + { + *sound_path = VOICE_CALL_AUDIO_EARJACK; + } + break; + + case VOICE_CALL_SND_PATH_RECEIVER: + default: + { + *sound_path = VOICE_CALL_AUDIO_RECEIVER; + } + break; + + } +#else + if (TRUE == voicecall_snd_get_status(papp_snd, VOICE_CALL_AUDIO_SPEAKER)) { + *sound_path = VOICE_CALL_AUDIO_SPEAKER; + } else if (TRUE == voicecall_snd_get_status(papp_snd, VOICE_CALL_AUDIO_HEADSET)) { + *sound_path = VOICE_CALL_AUDIO_HEADSET; + } else { + *sound_path = VOICE_CALL_AUDIO_EARJACK; + } +#endif + + return TRUE; +} + +static gboolean __voicecall_core_is_redial_cuase(int end_cause) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "end_cause(%d)",end_cause); + + switch (end_cause) + { + case VC_ENDCAUSE_CALL_BARRED: + case VC_ENDCAUSE_NO_SERVICE: + case VC_ENDCAUSE_USER_UNAVAILABLE: + case VC_ENDCAUSE_INVALID_NUMBER_FORMAT: + case VC_ENDCAUSE_NUMBER_CHANGED: + case VC_ENDCAUSE_NO_CREDIT: + case VC_ENDCAUSE_UNASSIGNED_NUMBER: + return FALSE; + + case VC_ENDCAUSE_CALL_ENDED: + case VC_ENDCAUSE_CALL_DISCONNECTED: + case VC_ENDCAUSE_NO_ANSWER: + case VC_ENDCAUSE_NW_BUSY: + case VC_ENDCAUSE_CALL_SERVICE_NOT_ALLOWED: + case VC_ENDCAUSE_NW_FAILED: + case VC_ENDCAUSE_REJECTED: + case VC_ENDCAUSE_USER_BUSY: + case VC_ENDCAUSE_WRONG_GROUP: + case VC_ENDCAUSE_CALL_NOT_ALLOWED: + case VC_ENDCAUSE_CALL_FAILED: + case VC_ENDCAUSE_NO_USER_RESPONDING: + case VC_ENDCAUSE_USER_ALERTING_NO_ANSWER: + case VC_ENDCAUSE_SERVICE_TEMP_UNAVAILABLE: + case VC_ENDCAUSE_USER_DOESNOT_RESPOND: + case VC_ENDCAUSE_IMEI_REJECTED: + case VC_ENDCAUSE_TAPI_ERROR: + default: + return TRUE; + } +} diff --git a/call-engine/voice-call-dbus.c b/call-engine/voice-call-dbus.c new file mode 100755 index 0000000..11b29a4 --- /dev/null +++ b/call-engine/voice-call-dbus.c @@ -0,0 +1,230 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include + +#include "voice-call-dbus.h" +#include "voice-call-engine.h" + +#include + +/* Voice Call <-- BT */ +#define DBUS_BT_MATCH_RULE "type='signal',path='/org/projectx/bluetooth_event',interface='User.Bluetooth.AG'" +#define DBUS_BT_OBJECT_REQUEST "/org/projectx/bluetooth_event" +#define DBUS_BT_INTERFACE_REQUEST "User.Bluetooth.AG" +#define DBUS_BT_METHOD_REQUEST "Request" + +/* Voice Call --> BT */ +#define DBUS_BT_SERVICE "org.projectx.bluetooth" +#define DBUS_BT_OBJECT_RESPONSE "/org/projectx/btcall_event" +#define DBUS_BT_INTERFACE_RESPONSE "User.Bluetooth.AG" +#define DBUS_BT_METHOD_RESPONSE "Response" +//#define DBUS_BT_METHOD_CONNECT "Connect" + +#define BT_PKG "org.tizen.bluetooth" + +static DBusGConnection *gconnection = NULL; + +typedef struct _dbus_dest_t { + char *service; + char *object_path; + char *interface; + char *method; +} dbus_dest_t; + +static int vc_engine_send_via_dbus(DBusGConnection * conn, dbus_dest_t * dest, int first_arg_type, ...) +{ + DBusMessage *msg; + DBusMessageIter iter; + va_list list; + int type; + dbus_bool_t ret; + + dbus_int32_t val_int; + char *val_str; + + CALL_ENG_DEBUG(ENG_DEBUG, "path:%s, interface:%s, method:%s \n", dest->object_path, dest->interface, dest->method); + msg = dbus_message_new_signal(dest->object_path, dest->interface, dest->method); + if (msg == NULL) { + CALL_ENG_DEBUG(ENG_DEBUG, "dbus_message_new_signal failed.\n"); + return VC_ERROR; + } + dbus_message_set_destination(msg, dest->service); + + dbus_message_iter_init_append(msg, &iter); + + type = first_arg_type; + + va_start(list, first_arg_type); + while (type != DBUS_TYPE_INVALID) { + switch (type) { + case DBUS_TYPE_INT32: + val_int = *(int *)(va_arg(list, dbus_int32_t)); + dbus_message_iter_append_basic(&iter, type, &val_int); + break; + + case DBUS_TYPE_STRING: + val_str = va_arg(list, char *); + dbus_message_iter_append_basic(&iter, type, &val_str); + break; + } + type = va_arg(list, int); + } + va_end(list); + + ret = dbus_connection_send(dbus_g_connection_get_connection(conn), msg, NULL); + dbus_connection_flush(dbus_g_connection_get_connection(conn)); + dbus_message_unref(msg); + + if (ret != TRUE) + return VC_ERROR; + + return VC_NO_ERROR; +} + +void vc_engine_on_dbus_send_connect_to_bt(void) +{ + bundle *kb; + kb = bundle_create(); + bundle_add(kb, "launch-type", "call"); + aul_launch_app(BT_PKG, kb); + bundle_free(kb); + CALL_ENG_DEBUG(ENG_DEBUG, "End.."); +} + +void vc_engine_on_dbus_send_response_to_bt(connectivity_bt_ag_param_info_t bt_resp_info) +{ + dbus_dest_t bt_dbus_dest = { + DBUS_BT_SERVICE, + DBUS_BT_OBJECT_RESPONSE, + DBUS_BT_INTERFACE_RESPONSE, + DBUS_BT_METHOD_RESPONSE + }; + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + + vc_engine_send_via_dbus(gconnection, &bt_dbus_dest, + DBUS_TYPE_INT32, &bt_resp_info.param1, + DBUS_TYPE_INT32, &bt_resp_info.param2, + DBUS_TYPE_INT32, &bt_resp_info.param3, + DBUS_TYPE_STRING, bt_resp_info.param4, + DBUS_TYPE_INVALID); +} + +/* Handle all bluetooth relative signal */ +static void vc_engine_on_dbus_parsing_bt(void *user_data, DBusMessage * message) +{ + DBusMessageIter iter; + connectivity_bt_ag_param_info_t bt_event_info = { 0, }; + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)vcall_engine_get_core_state(); + + if (dbus_message_iter_init(message, &iter)) + dbus_message_iter_get_basic(&iter, &bt_event_info.param1); + + if (dbus_message_iter_next(&iter)) + dbus_message_iter_get_basic(&iter, &bt_event_info.param2); + + if (dbus_message_iter_next(&iter)) + dbus_message_iter_get_basic(&iter, &bt_event_info.param3); + + if (dbus_message_iter_next(&iter)) + dbus_message_iter_get_basic(&iter, &bt_event_info.param4); + + CALL_ENG_DEBUG(ENG_DEBUG,"param1:[%d], param2[%d], param3[%d], param4[%s] \n", + bt_event_info.param1, bt_event_info.param2, bt_event_info.param3, bt_event_info.param4); + + _vc_bt_handle_bt_events(pcall_core, &bt_event_info); +} + +/* Handle all dbus signal */ +static DBusHandlerResult vc_engine_on_dbus_receive(DBusConnection * connection, DBusMessage * message, void *user_data) +{ + int type; + + const char *interface_name = dbus_message_get_interface(message); + const char *method_name = dbus_message_get_member(message); + const char *object_path = dbus_message_get_path(message); + + type = dbus_message_get_type(message); + if (type != DBUS_MESSAGE_TYPE_SIGNAL) { + /* + * INVALID: 0 + * METHOD_CALL: 1 + * METHOD_CALL_RETURN: 2 + * ERROR: 3 + * SIGNAL: 4 + */ + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + + if (object_path == NULL) { + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + if (interface_name == NULL) { + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + if (method_name == NULL) { + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + + /* Check BT Signal */ + if ((strcmp(object_path, DBUS_BT_OBJECT_REQUEST) == 0) && (strcmp(interface_name, DBUS_BT_INTERFACE_REQUEST) == 0)) { + CALL_ENG_DEBUG(ENG_DEBUG, "received DBus BT signal!\n"); + if (strcmp(method_name, DBUS_BT_METHOD_REQUEST) == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "BT Method :[Request] \n"); + vc_engine_on_dbus_parsing_bt(user_data, message); + return DBUS_HANDLER_RESULT_HANDLED; + } + } + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +int vc_engine_dbus_receiver_setup() +{ + GError *error = NULL; + DBusError derror; + int ret; + + // connectio to dbus-daemon. + gconnection = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error); + if (!gconnection) { + printf("Could not get connection: %s\n", error->message); + return FALSE; + } + + dbus_error_init(&derror); + + dbus_bus_add_match(dbus_g_connection_get_connection(gconnection), DBUS_BT_MATCH_RULE, &derror); + if (dbus_error_is_set(&derror)) // failure + { + CALL_ENG_DEBUG(ENG_DEBUG, "Failed to dbus_bus_add_match(%s): %s\n", DBUS_BT_MATCH_RULE, derror.message); + dbus_error_free(&derror); + return FALSE; + } + // register event filter to handle received dbus-message. + ret = dbus_connection_add_filter(dbus_g_connection_get_connection(gconnection), vc_engine_on_dbus_receive, NULL, NULL); + if (ret != TRUE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Failed to dbus_connection_add_filter"); + return FALSE; + } + + return TRUE; +} + diff --git a/call-engine/voice-call-device.c b/call-engine/voice-call-device.c new file mode 100755 index 0000000..76d4344 --- /dev/null +++ b/call-engine/voice-call-device.c @@ -0,0 +1,382 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "voice-call-device.h" +#include "voice-call-dbus.h" +#include "voice-call-core.h" +#include "voice-call-sound.h" +#include "voice-call-bt.h" +#include "voice-call-core.h" +#include "voice-call-engine-msg.h" + +#include "vc-core-callagent.h" +#include "vc-core-engine-types.h" +#include "vc-core-util.h" + +#include +#include + +static int g_proximity_sensor_handle = -1; +static int g_proximity_sensor_state = -1; + +static gboolean __voicecall_dvc_proximity_sensor_is_request(unsigned int type, sensor_event_data_t *event, void *data); +static void __voicecall_dvc_proximity_sensor_callback_func(unsigned int type, sensor_event_data_t *event, void *data); +static gboolean __voicecall_dvc_earjack_status_cb(keynode_t *node, call_vc_core_state_t *pcall_core); +static gboolean __voicecall_dvc_earjackkey_status_cb(keynode_t *node, call_vc_core_state_t *pcall_core); + +/** + * This function handles earjack event + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] node vconf node + * @param[in] pcall_core Handle to voicecall core + */ +static gboolean __voicecall_dvc_earjack_status_cb(keynode_t *node, call_vc_core_state_t *pcall_core) +{ + gboolean bRecieverPath = FALSE; + int earjack_status; + + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + + earjack_status = vconf_keynode_get_int(node); + + CALL_ENG_DEBUG(ENG_DEBUG, "Earjack Status: %d \n", earjack_status); + + vc_engine_headset_status_type event_data; + + /*Change path only if outgoing call or connected call exists */ +#ifdef _NEW_SND_ + if ((TRUE == voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine)) + || (TRUE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine))) { + if (earjack_status == TRUE) { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_EARJACK); + voicecall_snd_change_path(pcall_core->papp_snd); + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = earjack_status; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_EARJACK_STATUS_TO_UI, (void *)&event_data); + } else { + if (voicecall_snd_get_path_status(pcall_core->papp_snd) == VOICE_CALL_SND_PATH_EARJACK) { + if (_vc_bt_is_bt_connected(pcall_core) == TRUE) { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_BT); + /*_vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_SWITCH_TO_HEADSET, -1, NULL);*/ + _vc_bt_request_switch_headset_path(pcall_core, TRUE); + } else { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_RECEIVER); + voicecall_snd_change_path(pcall_core->papp_snd); + } + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = earjack_status; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_EARJACK_STATUS_TO_UI, (void *)&event_data); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "No path change"); + } + } + } +#else + if ((TRUE == voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine)) || (TRUE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine))) { + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = earjack_status; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_EARJACK_STATUS_TO_UI, (void *)&event_data); + } +#endif + return TRUE; +} + +/** + * This function handles earjack key event + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] node vconf node + * @param[in] pcall_core Handle to voicecall core + */ +static gboolean __voicecall_dvc_earjackkey_status_cb(keynode_t *node, call_vc_core_state_t *pcall_core) +{ + int key_value; + + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + + key_value = vconf_keynode_get_int(node); + + CALL_ENG_DEBUG(ENG_DEBUG, "key_value: %d \n", key_value); + + if (key_value > 0) { + if (voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) { + voicecall_core_end_all_calls(pcall_core); + } else if (voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { +#ifdef _NEW_SND_ + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_EARJACK); +#endif + voicecall_core_answer_call(pcall_core, FALSE); + } else if (voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine)) { + voicecall_core_cancel_call(pcall_core); + } + } + + return TRUE; +} + +/** + * This function initialize earjack event. + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + */ +gboolean _voicecall_dvc_earjack_init(call_vc_core_state_t *pcall_core) +{ +#ifdef _NEW_SND_ +#else + int earjack_status = -1; + if (!vconf_get_int(VCONFKEY_SYSMAN_EARJACK, &earjack_status)) { + CALL_ENG_DEBUG(ENG_DEBUG, "earjack_status:[%d]\n", earjack_status); + if (earjack_status == VCONFKEY_SYSMAN_EARJACK_REMOVED) { + voicecall_snd_set_status(pcall_core->papp_snd, VOICE_CALL_AUDIO_EARJACK, FALSE); + CALL_ENG_DEBUG(ENG_DEBUG, "*****************VOICE_CALL_AUDIO_EARJACK = FALSE **********\n"); + } else { + voicecall_snd_set_status(pcall_core->papp_snd, VOICE_CALL_AUDIO_EARJACK, TRUE); + CALL_ENG_DEBUG(ENG_DEBUG, "*****************VOICE_CALL_AUDIO_EARJACK = TRUE **********\n"); + } + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..\n"); + voicecall_snd_set_status(pcall_core->papp_snd, VOICE_CALL_AUDIO_EARJACK, FALSE); + } +#endif + + vconf_notify_key_changed(VCONFKEY_SYSMAN_EARJACK, (void *)__voicecall_dvc_earjack_status_cb, pcall_core); + vconf_notify_key_changed(VCONFKEY_SYSMAN_EARJACKKEY, (void *)__voicecall_dvc_earjackkey_status_cb, pcall_core); + return TRUE; +} + +void _voicecall_dvc_get_earjack_status(call_vc_core_state_t *pcall_core) +{ + int earjack_status = -1; + if (!vconf_get_int(VCONFKEY_SYSMAN_EARJACK, &earjack_status)) { + CALL_ENG_DEBUG(ENG_DEBUG, "earjack_status:[%d]\n", earjack_status); + if (earjack_status == VCONFKEY_SYSMAN_EARJACK_REMOVED) { + voicecall_snd_set_status(pcall_core->papp_snd, VOICE_CALL_AUDIO_EARJACK, FALSE); + CALL_ENG_DEBUG(ENG_DEBUG, "*****************VOICE_CALL_AUDIO_EARJACK = FALSE **********\n"); + } else { + voicecall_snd_set_status(pcall_core->papp_snd, VOICE_CALL_AUDIO_EARJACK, TRUE); + CALL_ENG_DEBUG(ENG_DEBUG, "*****************VOICE_CALL_AUDIO_EARJACK = TRUE **********\n"); + } + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..\n"); + voicecall_snd_set_status(pcall_core->papp_snd, VOICE_CALL_AUDIO_EARJACK, FALSE); + } +} + +gboolean _voicecall_dvc_get_earjack_connected() +{ + int earjack_status = -1; + if (!vconf_get_int(VCONFKEY_SYSMAN_EARJACK, &earjack_status)) { + CALL_ENG_DEBUG(ENG_DEBUG, "earjack_status:[%d]\n", earjack_status); + if (earjack_status == VCONFKEY_SYSMAN_EARJACK_REMOVED) { + return FALSE; + } else { + return TRUE; + } + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..\n"); + return FALSE; + } +} + +void _voicecall_dvc_control_lcd_state(voicecall_lcd_control_t state) +{ + CALL_ENG_DEBUG(ENG_DEBUG,"[%d]", state); + switch (state) { + case VC_LCD_OFF: + pm_change_state(LCD_OFF); + break; + + case VC_LCD_ON: + pm_change_state(LCD_NORMAL); + break; + + case VC_LCD_ON_LOCK: + pm_lock_state(LCD_NORMAL, GOTO_STATE_NOW, 0); + break; + + case VC_LCD_ON_UNLOCK: + pm_unlock_state(LCD_NORMAL, PM_RESET_TIMER); + break; + + default: + break; + } +} + +gboolean _voicecall_dvc_proximity_sensor_init(void *data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + int ret = -1; + int handle = -1; +#ifdef _POLLING_PROXIMITY_SENSOR_ + event_condition_t my_cond; +#endif + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)data; + sensor_data_t cur_sensor_data; + + if (g_proximity_sensor_handle >= 0) { + CALL_ENG_DEBUG(ENG_WARN, "already initialized"); + return FALSE; + } + + handle = sf_connect(PROXIMITY_SENSOR); + if (handle < 0) { + CALL_ENG_DEBUG(ENG_ERR, "sf_connect failed"); + return FALSE; + } + +#ifdef _POLLING_PROXIMITY_SENSOR_ + my_cond.cond_op = CONDITION_EQUAL; + my_cond.cond_value1 = 200; + ret = sf_register_event(handle, PROXIMITY_EVENT_CHANGE_STATE, &my_cond, __voicecall_dvc_proximity_sensor_callback_func, pcall_core); +#else + ret = sf_register_event(handle, PROXIMITY_EVENT_CHANGE_STATE, NULL, __voicecall_dvc_proximity_sensor_callback_func, pcall_core); +#endif + if (ret < 0) { + CALL_ENG_DEBUG(ENG_ERR, "sf_register_event failed"); + return FALSE; + } + + ret = sf_start(handle, 0); + if (ret < 0) { + CALL_ENG_DEBUG(ENG_ERR, "sensor_start fail"); + return FALSE; + } + + ret = sf_get_data(handle, PROXIMITY_BASE_DATA_SET, &cur_sensor_data); + if (ret < 0) { + CALL_ENG_DEBUG(ENG_ERR, "sf_get_data fail"); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "proximity_state:[%d]\n", cur_sensor_data.values[0]); + if (cur_sensor_data.values[0] == PROXIMITY_STATE_NEAR) { + if (__voicecall_dvc_proximity_sensor_is_required(pcall_core)) { + CALL_ENG_DEBUG(ENG_DEBUG, "PROXIMITY_STATE_NEAR"); + g_proximity_sensor_state = VCALL_SENSOR_NEAR; + _voicecall_dvc_control_lcd_state(VC_LCD_OFF); + } + } + + g_proximity_sensor_handle = handle; + CALL_ENG_DEBUG(ENG_DEBUG, "_voicecall_dvc_proximity_sensor_init done"); +} + +gboolean __voicecall_dvc_proximity_sensor_is_required(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = NULL; + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + if (pcall_core == NULL) { + CALL_ENG_DEBUG(ENG_ERR, "Wrong pointer for pcall_core"); + return FALSE; + } + + pcall_engine = pcall_core->pcall_engine; + if (pcall_engine == NULL) { + CALL_ENG_DEBUG(ENG_ERR, "Wrong pointer for pcall_engine"); + return FALSE; + } + + if (_vc_core_cm_isexists_incoming_call(&(pcall_engine->call_manager)) == TRUE) { + CALL_ENG_DEBUG(ENG_DEBUG, "we'll not excute sensor in case of incoming call"); + return FALSE; + } + + if ((_vc_core_cm_isexists_connected_call(&(pcall_engine->call_manager)) == FALSE) && + (_vc_core_cm_isexits_outgoing_call(&(pcall_engine->call_manager)) == FALSE)) { + CALL_ENG_DEBUG(ENG_DEBUG, "we'll not excute sensor in case of NO call"); + return FALSE; + } + + if (voicecall_snd_get_path_status(pcall_core->papp_snd) == VOICE_CALL_SND_PATH_SPEAKER) { + CALL_ENG_DEBUG(ENG_DEBUG, "we'll not excute sensor in case of speaker mode"); + return FALSE; + } + + return TRUE; +} + +gboolean _voicecall_dvc_proximity_sensor_deinit(void) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + int ret = -1; + + if (g_proximity_sensor_handle < 0) { + CALL_ENG_DEBUG(ENG_WARN, "not initialized."); + return FALSE; + } + + ret = sf_unregister_event(g_proximity_sensor_handle, PROXIMITY_EVENT_CHANGE_STATE); + if (ret < 0) { + CALL_ENG_DEBUG(ENG_ERR, "sf_unregister_event failed"); + } + ret = sf_stop(g_proximity_sensor_handle); + if (ret < 0) { + CALL_ENG_DEBUG(ENG_ERR, "sf_stop failed"); + } + ret = sf_disconnect(g_proximity_sensor_handle); + if (ret < 0) { + CALL_ENG_DEBUG(ENG_ERR, "sf_disconnect failed"); + } + + g_proximity_sensor_handle = -1; + return TRUE; +} + +static void __voicecall_dvc_proximity_sensor_callback_func(unsigned int type, sensor_event_data_t *event, void *data) +{ + int *proxi_state; + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)data; + voicecall_engine_t *pcall_engine = NULL; + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + if (__voicecall_dvc_proximity_sensor_is_required(pcall_core) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Proximity sensor update is not required"); + return; + } + + if (type != PROXIMITY_EVENT_CHANGE_STATE) { + return; + } + + proxi_state = (int *)(event->event_data); + switch (*proxi_state) { + case PROXIMITY_STATE_FAR: + CALL_ENG_DEBUG(ENG_DEBUG, "PROXIMITY_STATE_FAR"); + g_proximity_sensor_state = VCALL_SENSOR_FAR; + _voicecall_dvc_control_lcd_state(VC_LCD_ON); + break; + case PROXIMITY_STATE_NEAR: + CALL_ENG_DEBUG(ENG_DEBUG, "PROXIMITY_STATE_NEAR"); + g_proximity_sensor_state = VCALL_SENSOR_NEAR; + _voicecall_dvc_control_lcd_state(VC_LCD_OFF); + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "wrong data"); + break; + } +} + +int _voicecall_dvc_get_proximity_sensor_state(void) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "g_proximity_sensor_state(%d)", g_proximity_sensor_state); + + return g_proximity_sensor_state; +} diff --git a/call-engine/voice-call-engine.c b/call-engine/voice-call-engine.c new file mode 100755 index 0000000..a9b5377 --- /dev/null +++ b/call-engine/voice-call-engine.c @@ -0,0 +1,872 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "voice-call-engine.h" +#include "vc-core-util.h" +#include "voice-call-core.h" +#include "vc-core-engine-types.h" +#include "voice-call-service.h" +#include "voice-call-dbus.h" + +typedef struct { + void *puser_data; + vcall_engine_app_cb cb_func; +} app_cb_t; + +call_vc_core_state_t *global_pcall_core = NULL; + +static app_cb_t *app_client_data = NULL; + +/** + * This function send events to client. + * + * @return int API Result Code. + * @param[in] +*/ +gboolean vcall_engine_send_event_to_client(int event, void *pdata) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + if (app_client_data->cb_func != NULL) { + CALL_ENG_DEBUG(ENG_DEBUG, "Sending Event to APP Client\n"); + app_client_data->cb_func(event, pdata, app_client_data->puser_data); + } + CALL_ENG_DEBUG(ENG_ERR, "End..\n"); + return TRUE; +} + +/** + * This function initialize voice call engine. + * + * @return int API Result Code. + * @param[in] +*/ +int vcall_engine_init(vcall_engine_app_cb pcb_func, void *puser_data) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + + /* thread system initialization */ + if (!g_thread_supported()) { + CALL_ENG_KPI("g_thread_init start"); + g_thread_init(NULL); + CALL_ENG_KPI("g_thread_init done"); + } + + global_pcall_core = (call_vc_core_state_t *)calloc(1, sizeof(call_vc_core_state_t)); + if (global_pcall_core == NULL) { + CALL_ENG_DEBUG(ENG_ERR, "Memory Allocation Failed\n"); + return VCALL_ENGINE_API_FAILED; + } + CALL_ENG_DEBUG(ENG_DEBUG, "global_pcall_core alloctated memory:[%d],global_pcall_core(0x%x) \n", sizeof(call_vc_core_state_t), global_pcall_core); + + if (FALSE == voicecall_core_init(global_pcall_core)) { + CALL_ENG_DEBUG(ENG_DEBUG, "voicecall_core_init() failed"); + return VCALL_ENGINE_API_FAILED; + } + + app_client_data = (app_cb_t *) calloc(1, sizeof(app_cb_t)); + if (app_client_data == NULL) { + CALL_ENG_DEBUG(ENG_ERR, "Memory Allocation Failed\n"); + return VCALL_ENGINE_API_FAILED; + } + app_client_data->cb_func = pcb_func; + app_client_data->puser_data = puser_data; + + CALL_ENG_DEBUG(ENG_DEBUG, "Init dbus connection\n"); + vc_engine_dbus_receiver_setup(); + return VCALL_ENGINE_API_SUCCESS; + +} + +/** + * This function processes mo nomal call. + * + * @return int API Result Code. + * @param[in] +*/ +int vcall_engine_process_normal_call(char *number, int ct_index, gboolean b_download_call) +{ + CALL_ENG_DEBUG(ENG_DEBUG, " number is (%s)\n", number); + voicecall_engine_t *pcall_engine = global_pcall_core->pcall_engine; + vc_engine_outgoing_type event_data; + char number_after_removal[VC_PHONE_NUMBER_LENGTH_MAX] = {"\0",}; + int io_state; + + if (number == NULL || pcall_engine == NULL) + return VCALL_ENGINE_API_FAILED; + + _vc_core_engine_status_set_download_call(pcall_engine, b_download_call); + + /* check the call-engine state before proceeding with call processing */ + _vc_core_engine_status_get_engine_iostate(pcall_engine, &io_state); + if (io_state != VC_INOUT_STATE_NONE) { + CALL_ENG_DEBUG(ENG_DEBUG, "IO State [%d] not NONE, cannot proceed with the call \n", io_state); + voicecall_core_set_status(global_pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + vc_engine_msg_box_type mbox_event_data; + + memset(&mbox_event_data, 0, sizeof(mbox_event_data)); + mbox_event_data.string_id = IDS_CALL_POP_CALLNOTCALLOWED; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&mbox_event_data); + return VCALL_ENGINE_API_FAILED; + } + + memset(&(global_pcall_core->call_setup_info), 0, sizeof(global_pcall_core->call_setup_info)); + global_pcall_core->call_setup_info.call_setup_by = VC_CALL_SETUP_BY_NORMAL; + global_pcall_core->call_setup_info.call_type = VC_CALL_ORIG_TYPE_NORMAL; + + memset(&event_data, 0, sizeof(event_data)); + + _vc_core_util_remove_invalid_chars(number, number_after_removal); + snprintf(global_pcall_core->call_setup_info.source_tel_number, VC_PHONE_NUMBER_LENGTH_MAX, number_after_removal); + voicecall_core_extract_phone_number(number_after_removal, event_data.call_num, VC_PHONE_NUMBER_LENGTH_MAX); + + if (strlen(event_data.call_num) > VC_PHONE_NUMBER_LENGTH_MAX) { + CALL_ENG_DEBUG(ENG_ERR, " WARNING!! number is larger than max num length!! \n"); + memcpy(global_pcall_core->call_setup_info.tel_number, event_data.call_num, VC_PHONE_NUMBER_LENGTH_MAX); + } else { + memcpy(global_pcall_core->call_setup_info.tel_number, event_data.call_num, strlen(event_data.call_num)); + } + CALL_ENG_DEBUG(ENG_DEBUG, "number:[%s]", number); + CALL_ENG_DEBUG(ENG_DEBUG, "number_after_removal:[%s]", number_after_removal); + CALL_ENG_DEBUG(ENG_DEBUG, "global_pcall_core->call_setup_info.source_tel_number:[%s]", global_pcall_core->call_setup_info.source_tel_number); + CALL_ENG_DEBUG(ENG_DEBUG, "global_pcall_core->call_setup_info.tel_number:[%s]", global_pcall_core->call_setup_info.tel_number); + CALL_ENG_DEBUG(ENG_DEBUG, "event_data.call_num:[%s]", event_data.call_num); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_TO_UI, (void *)&event_data); + + if (voicecall_core_setup_call(global_pcall_core, FALSE)) { + CALL_ENG_DEBUG(ENG_DEBUG, " success!! \n"); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, " failed!! \n"); + } + return VCALL_ENGINE_API_SUCCESS; + +} + +/** + * This function processes mo emergency call. + * + * @return int API Result Code. + * @param[in] +*/ +int vcall_engine_process_emergency_call(char *number) +{ + CALL_ENG_DEBUG(ENG_DEBUG, " number is : [%s] \n", number); + voicecall_engine_t *pcall_engine = global_pcall_core->pcall_engine; + gboolean bDefaultNumber = FALSE; + vc_engine_outgoing_type event_data; + int io_state; + + /* check the call-engine state before proceeding with emergency call processing */ + _vc_core_engine_status_get_engine_iostate(pcall_engine, &io_state); + if (io_state != VC_INOUT_STATE_NONE) { + CALL_ENG_DEBUG(ENG_DEBUG, "IO State [%d] not NONE, cannot proceed with the call \n", io_state); + voicecall_core_set_status(global_pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + vc_engine_msg_box_type mbox_event_data; + + memset(&mbox_event_data, 0, sizeof(mbox_event_data)); + mbox_event_data.string_id = IDS_CALL_POP_CALLNOTCALLOWED; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&mbox_event_data); + return VCALL_ENGINE_API_FAILED; + } + + memset(&event_data, 0, sizeof(event_data)); + + memset(&(global_pcall_core->call_setup_info), 0, sizeof(global_pcall_core->call_setup_info)); + + bDefaultNumber = strlen(number) ? FALSE : TRUE; + if (bDefaultNumber == TRUE) { + global_pcall_core->call_setup_info.call_setup_by = VC_CALL_SETUP_BY_NORMAL; + global_pcall_core->call_setup_info.call_type = VC_CALL_ORIG_TYPE_EMERGENCY; + if (strlen("911") < sizeof(event_data.call_num)) + _vc_core_util_strcpy(event_data.call_num, VC_PHONE_NUMBER_LENGTH_MAX, "911"); + + memcpy(global_pcall_core->call_setup_info.tel_number, "911", strlen("911")); + } else { + global_pcall_core->call_setup_info.call_setup_by = VC_CALL_SETUP_BY_NORMAL; + global_pcall_core->call_setup_info.call_type = VC_CALL_ORIG_TYPE_PINLOCK; + voicecall_core_extract_phone_number(number, event_data.call_num, VC_PHONE_NUMBER_LENGTH_MAX); + if (strlen(number) > VC_PHONE_NUMBER_LENGTH_MAX) { + CALL_ENG_DEBUG(ENG_ERR, " WARNING!! number is larger than max num length!! \n"); + memcpy(global_pcall_core->call_setup_info.source_tel_number, number, VC_PHONE_NUMBER_LENGTH_MAX); + memcpy(global_pcall_core->call_setup_info.tel_number, number, VC_PHONE_NUMBER_LENGTH_MAX); + } else { + memcpy(global_pcall_core->call_setup_info.source_tel_number, number, VC_PHONE_NUMBER_LENGTH_MAX); + memcpy(global_pcall_core->call_setup_info.tel_number, number, strlen(number)); + } + } + + event_data.contact_index = -1; + event_data.phone_type = -1; + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_TO_UI, (void *)&event_data); + + if (voicecall_core_setup_call(global_pcall_core, TRUE)) { + CALL_ENG_DEBUG(ENG_DEBUG, " success!! \n"); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, " failed!! \n"); + } + return VCALL_ENGINE_API_SUCCESS; +} + +int vcall_engine_process_emergency_call_test(char *number) +{ + CALL_ENG_DEBUG(ENG_DEBUG, " number is : [%s] \n", number); + voicecall_engine_t *pcall_engine = global_pcall_core->pcall_engine; + gboolean bDefaultNumber = FALSE; + vc_engine_outgoing_type event_data; + int io_state; + + /* check the call-engine state before proceeding with emergency call processing */ + _vc_core_engine_status_get_engine_iostate(pcall_engine, &io_state); + if (io_state != VC_INOUT_STATE_NONE) { + CALL_ENG_DEBUG(ENG_DEBUG, "IO State [%d] not NONE, cannot proceed with the call \n", io_state); + voicecall_core_set_status(global_pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + vc_engine_msg_box_type mbox_event_data; + + memset(&mbox_event_data, 0, sizeof(mbox_event_data)); + mbox_event_data.string_id = IDS_CALL_POP_CALLNOTCALLOWED; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&mbox_event_data); + return VCALL_ENGINE_API_FAILED; + } + + memset(&event_data, 0, sizeof(event_data)); + + memset(&(global_pcall_core->call_setup_info), 0, sizeof(global_pcall_core->call_setup_info)); + + bDefaultNumber = strlen(number) ? FALSE : TRUE; + if (bDefaultNumber == TRUE) { + global_pcall_core->call_setup_info.call_setup_by = VC_CALL_SETUP_BY_NORMAL; + global_pcall_core->call_setup_info.call_type = VC_CALL_ORIG_TYPE_EMERGENCY; + if (strlen("911") < sizeof(event_data.call_num)) + _vc_core_util_strcpy(event_data.call_num, VC_PHONE_NUMBER_LENGTH_MAX, "911"); + + memcpy(global_pcall_core->call_setup_info.tel_number, "911", strlen("911")); + } else { + global_pcall_core->call_setup_info.call_setup_by = VC_CALL_SETUP_BY_NORMAL; + global_pcall_core->call_setup_info.call_type = VC_CALL_ORIG_TYPE_PINLOCK; + voicecall_core_extract_phone_number(number, event_data.call_num, VC_PHONE_NUMBER_LENGTH_MAX); + if (strlen(number) > VC_PHONE_NUMBER_LENGTH_MAX) { + CALL_ENG_DEBUG(ENG_ERR, " WARNING!! number is larger than max num length!! \n"); + memcpy(global_pcall_core->call_setup_info.source_tel_number, number, VC_PHONE_NUMBER_LENGTH_MAX); + memcpy(global_pcall_core->call_setup_info.tel_number, number, VC_PHONE_NUMBER_LENGTH_MAX); + } else { + memcpy(global_pcall_core->call_setup_info.source_tel_number, number, VC_PHONE_NUMBER_LENGTH_MAX); + memcpy(global_pcall_core->call_setup_info.tel_number, number, strlen(number)); + } + } + + event_data.contact_index = -1; + event_data.phone_type = -1; + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_TO_UI, (void *)&event_data); + + { + int call_handle = 1; + vc_engine_outgoing_orig_type orig_event_data; + call_vc_call_objectinfo_t callobject_info; + + memset(&orig_event_data, 0, sizeof(orig_event_data)); + orig_event_data.call_handle = call_handle; + orig_event_data.bemergency = TRUE; + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, bemergency:[%d] \n", orig_event_data.call_handle, orig_event_data.bemergency); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_ORIG_TO_UI_TEST, (void *)&orig_event_data); + } + + return VCALL_ENGINE_API_SUCCESS; +} + +/** + * This function processes sat setup call. + * + * @return int API Result Code. + * @param[in] +*/ +int vcall_engine_process_sat_setup_call(vcall_engine_sat_setup_call_info_t *sat_setup_call_info) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + voicecall_core_process_sat_setup_call(sat_setup_call_info); + return VCALL_ENGINE_API_SUCCESS; +} + +/** + * This function processes incoming call. + * + * @return int API Result Code. + * @param[in] +*/ +int vcall_engine_process_incoming_call(vcall_engine_incoming_info_t *incoming_call_info) +{ + call_vc_core_incoming_info_t tmp_incom_info = { 0, }; + + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + + tmp_incom_info.call_handle = incoming_call_info->call_handle; + tmp_incom_info.call_type = incoming_call_info->call_type; + tmp_incom_info.cli_presentation_indicator = incoming_call_info->cli_presentation_indicator; + _vc_core_util_strcpy(tmp_incom_info.call_num, sizeof(tmp_incom_info.call_num), incoming_call_info->call_num); + tmp_incom_info.calling_name_mode = incoming_call_info->calling_name_mode; + _vc_core_util_strcpy(tmp_incom_info.calling_name, sizeof(tmp_incom_info.calling_name), incoming_call_info->calling_name); + _vc_core_util_strcpy(tmp_incom_info.redirected_number, sizeof(tmp_incom_info.redirected_number), incoming_call_info->redirected_number); + _vc_core_util_strcpy(tmp_incom_info.redirected_sub_address, sizeof(tmp_incom_info.redirected_sub_address), incoming_call_info->redirected_sub_address); + tmp_incom_info.cli_cause = incoming_call_info->cli_cause; + tmp_incom_info.bfwded = incoming_call_info->bfwded; + tmp_incom_info.active_line = incoming_call_info->active_line; + + voicecall_core_process_incoming_call(&tmp_incom_info); + return VCALL_ENGINE_API_SUCCESS; +} + +/** + * This function answers an incoming call + * + * @return int API Result Code. + * @param[in] none +*/ +int vcall_engine_answer_call(void) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + int ret = VCALL_ENGINE_API_FAILED; + + ret = voicecall_core_answer_call(global_pcall_core, FALSE); + CALL_ENG_DEBUG(ENG_DEBUG, " ret:[%d] \n", ret); + return ret; +} + +/** + * This function answers an incoming call according to the given type + * + * @return int API Result Code. + * @param[in] answer_type answer type + */ +int vcall_engine_answer_call_by_type(vcall_engine_answer_type_t answer_type) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + CALL_ENG_DEBUG(ENG_DEBUG, "answer_type:[%d]\n", answer_type); + + if (TRUE == voicecall_core_answer_call_bytype(global_pcall_core, answer_type)) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } + +} + +/** + * This function cancel outgoing call + * + * @return int API Result Code. + * @param[in] none + */ +int vcall_engine_cancel_call(void) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + + if (TRUE == voicecall_core_cancel_call(global_pcall_core)) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function reject incoming call + * + * @return int API Result Code. + * @param[in] none + */ +int vcall_engine_reject_call(void) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + + if (TRUE == voicecall_core_reject_mt(global_pcall_core, TRUE)) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function release a active or held call + * + * @return int API Result Code. + * @param[in] none + */ +int vcall_engine_release_call(void) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + + if (TRUE == voicecall_core_end_call(global_pcall_core)) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function release a call by handle + * + * @return int API Result Code. + * @param[in] int call_handle + */ +int vcall_engine_release_call_by_handle(int call_handle) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle:[%d]\n", call_handle); + + if (TRUE == voicecall_core_end_call_by_handle(global_pcall_core, call_handle)) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function release calls by type + * + * @return int API Result Code. + * @param[in] release_type release_type + */ +int vcall_engine_release_call_by_type(vcall_engine_release_type_t release_type) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + int ret = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, " release_type : [%d]\n", release_type); + switch (release_type) { + case VCALL_ENGINE_RELEASE_ALL_ACTIVE_CALLS: + { + ret = voicecall_core_end_all_active_calls(global_pcall_core); + } + break; + + case VCALL_ENGINE_RELEASE_ALL_HELD_CALLS: + { + ret = voicecall_core_end_all_held_calls(global_pcall_core); + } + break; + + case VCALL_ENGINE_RELEASE_ALL_CALLS: + { + ret = voicecall_core_end_all_calls(global_pcall_core); + } + break; + + default: + CALL_ENG_DEBUG(ENG_DEBUG, " Unknown release_type : [%d]\n", release_type); + break; + + } + + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function processes hold/retrive/swap calls. + * + * @return int API Result Code. + * @param[in] none + */ +int vcall_engine_process_hold_call(void) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + int ret = FALSE; + + ret = voicecall_core_process_hold_call(global_pcall_core); + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function processes in call SS code.. + * + * @return int API Result Code. + * @param[in] none + */ +void vcall_engine_process_incall_ss(char *number) +{ + CALL_ENG_DEBUG(ENG_WARN, "number(%s)\n"); + + voicecall_core_process_incall_ss(global_pcall_core, number); +} + +/** + * This function sets up a conference calls + * + * @return int API Result Code. + * @param[in] none + */ +int vcall_engine_join_call(void) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + int ret = FALSE; + + ret = voicecall_core_setup_conference(global_pcall_core); + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function make a private call in conference calls. + * + * @return int API Result Code. + * @param[in] int call_handle + */ +int vcall_engine_split_call(int call_handle) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + int ret = FALSE; + + ret = voicecall_core_make_private_call(global_pcall_core, call_handle); + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function transfers the call from active call to the held call + * + * @return int API Result Code. + * @param[in] int call_handle + */ +int vcall_engine_transfer_call(void) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + int ret = FALSE; + + ret = voicecall_core_transfer_calls(global_pcall_core); + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function processed loud speaker. + * + * @return int API Result Code. + * @param[in] int bstatus + */ +int vcall_engine_process_loudspeaker(int bstatus) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + int ret = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, " bstatus : [%d]\n", bstatus); + if (bstatus) { + ret = voicecall_service_loudspeaker_on(global_pcall_core); + } else { + ret = voicecall_service_loudspeaker_off(global_pcall_core); + } + + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function processed voice mute status. + * + * @return int API Result Code. + * @param[in] int bstatus + */ +int vcall_engine_process_voice_mute(int bstatus) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + int ret = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, " bstatus : [%d]\n", bstatus); + if (bstatus) { + ret = voicecall_service_mute_status_on(global_pcall_core); + } else { + ret = voicecall_service_mute_status_off(global_pcall_core); + } + + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function gets the volume level + * + * @return int API Result Code. + * @param[in] vcall_engine_vol_type_t vol_type + * @param[in] voicecall_snd_volume_alert_type_t vol_alert_type + */ +int vcall_engine_get_volume_level(vcall_engine_vol_type_t vol_type) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + + CALL_ENG_DEBUG(ENG_DEBUG, " vol_type : [%d]\n", vol_type); + + return voicecall_snd_get_volume(global_pcall_core->papp_snd, vol_type); + +} + +/** + * This function sets the volume level + * + * @return int API Result Code. + * @param[in] vcall_engine_vol_type_t vol_type + * @param[in] int vol_level + */ +int vcall_engine_set_volume_level(vcall_engine_vol_type_t vol_type, int vol_level) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + int ret = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, " vol_type : [%d], vol_level:[%d]\n", vol_type, vol_level); + ret = voicecall_service_set_volume(global_pcall_core, vol_type, vol_level); + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function stop alert + * + * @return int API Result Code. + * @param[in] none + */ +int vcall_engine_stop_alert(void) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + int ret = FALSE; + + ret = voicecall_core_stop_alert(global_pcall_core); + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function mute alert. + * + * @return int API Result Code. + * @param[in] none + */ +int vcall_engine_mute_alert(void) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + int ret = FALSE; + + ret = voicecall_snd_mute_alert(global_pcall_core->papp_snd); + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function process auto redial. + * + * @return int API Result Code. + * @param[in] int bstatus + */ +int vcall_engine_process_auto_redial(int bstatus) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + int ret = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, " bstatus : [%d]\n", bstatus); + if (bstatus) { + ret = voicecall_core_start_redial(global_pcall_core, TRUE); + } else { + ret = voicecall_core_stop_redial(global_pcall_core); + } + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function send the DTMF number + * + * @return int API Result Code. + * @param[in] char* dtmf_number + */ +int vcall_engine_send_dtmf_number(char *dtmf_number) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + int ret = FALSE; + + ret = voicecall_core_send_dtmf(global_pcall_core, dtmf_number); + + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function processed sound path + * + * @return int API Result Code. + * @param[in] int sound_path + */ +int vcall_engine_change_sound_path(vcall_engine_audio_type_t sound_path) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + int ret = FALSE; + + ret = voicecall_core_change_sound_path(global_pcall_core, sound_path); + + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function get sound path + * + * @return int API Result Code. + * @param[out] int sound_path + */ +int vcall_engine_get_sound_path(int *sound_path) +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + int ret = FALSE; + int snd_path = 0; + + ret = voicecall_core_get_sound_path(global_pcall_core, &snd_path); + + if (snd_path == VOICE_CALL_AUDIO_SPEAKER) { + *sound_path = VCALL_ENGINE_AUDIO_SPEAKER; + } else if (snd_path == VOICE_CALL_AUDIO_RECEIVER) { + *sound_path = VCALL_ENGINE_AUDIO_RECEIVER; + } else if (snd_path == VOICE_CALL_AUDIO_HEADSET) { + *sound_path = VCALL_ENGINE_AUDIO_HEADSET; + } else if (snd_path == VOICE_CALL_AUDIO_EARJACK) { + *sound_path = VCALL_ENGINE_AUDIO_EARJACK; + } else { + *sound_path = VCALL_ENGINE_AUDIO_RECEIVER; + } + + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function set call engine to default + * + * @return int API Result Code. + * @param[in] + */ +int vcall_engine_set_to_default() +{ + CALL_ENG_DEBUG(ENG_WARN, "..\n"); + int ret = FALSE; + + ret = voicecall_core_set_to_default(global_pcall_core); + + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +gpointer vcall_engine_get_core_state(void) +{ + return global_pcall_core; +} + +/** + * This function is interface to call-utility to perform string copy + * + * @return instance of the core state + * @param[out] pbuffer Target Buffer + * @param[in] buf_count Size of Target Buffer + * @param[in] pstring Source String + */ +gboolean vcall_engine_util_strcpy(char *pbuffer, int buf_count, const char *pstring) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + return _vc_core_util_strcpy(pbuffer, buf_count, pstring); +} + +/** + * This function returns the number of groups + * + * @param[in] pcount count of the groups + */ +gboolean vcall_engine_get_group_count(int *pcount) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + return _vc_core_engine_group_get_enabled_group_count(global_pcall_core->pcall_engine, pcount); +} + +/** + * This function is interface to call-utility to perform string copy + * + * @return instance of the core state + * @param[out] pbuffer Target Buffer + * @param[in] time time + */ +char *vcall_engine_util_get_date_time(time_t time) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + return _vc_core_util_get_date_time(time); +} + +/** + * This function is force reset all engine status. + * + * @return void + * @param[in] void + */ +void vcall_engine_force_reset(void) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + voicecall_snd_unregister_cm(global_pcall_core->papp_snd); + + _vc_core_util_set_call_status(VCONFKEY_CALL_OFF); + + voicecall_core_end_all_calls(global_pcall_core); +} diff --git a/call-engine/voice-call-service.c b/call-engine/voice-call-service.c new file mode 100755 index 0000000..f48e808 --- /dev/null +++ b/call-engine/voice-call-service.c @@ -0,0 +1,244 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "voice-call-service.h" +#include "voice-call-dbus.h" +#include "vc-core-util.h" +#include "voice-call-core.h" +#include "voice-call-sound.h" +#include "voice-call-bt.h" + +/** + * This function on the loud speaker state + * + * @return gboolean + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_service_loudspeaker_on(call_vc_core_state_t *pcall_core) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core != NULL); + + gboolean bloud_speaker = FALSE; + voicecall_snd_mgr_t *papp_snd = pcall_core->papp_snd; + gboolean ret = FALSE; + int total_call_member = -1; + + CALL_ENG_DEBUG(ENG_DEBUG, "\n"); + + voicecall_core_get_total_call_member(pcall_core->pcall_engine, &total_call_member); + if (total_call_member == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "There are not active calls hence it should not work \n"); + return FALSE; + } + + /* Toggle the LoudSpeaker Status */ +#ifdef _NEW_SND_ + if (voicecall_snd_get_path_status(pcall_core->papp_snd) != VOICE_CALL_SND_PATH_SPEAKER) { + if (TRUE == _vc_bt_is_bt_connected(pcall_core) && + (voicecall_snd_get_path_status(pcall_core->papp_snd) == VOICE_CALL_SND_PATH_BT)) { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_SPEAKER); +/* _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_SWITCH_TO_PHONE, -1, NULL);*/ + _vc_bt_request_switch_headset_path(pcall_core, FALSE); + } else { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_SPEAKER); + voicecall_snd_change_path(papp_snd); + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "loudspeacker is already on.\n"); + ret = FALSE; + } +#else + bloud_speaker = voicecall_snd_get_status(papp_snd, VOICE_CALL_AUDIO_SPEAKER); + if (bloud_speaker == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Change to Speaker On. \n"); + + /*If current Path is Set to BT Headset, Change Path from Headset to Phone */ + if (TRUE == _vc_bt_is_bt_connected(pcall_core)) { + if (TRUE == voicecall_snd_get_status(papp_snd, VOICE_CALL_AUDIO_HEADSET)) { + voicecall_snd_set_status(papp_snd, VOICE_CALL_AUDIO_HEADSET, FALSE); +/* _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_SWITCH_TO_PHONE, -1, NULL);*/ + _vc_bt_request_switch_headset_path(pcall_core, FALSE); + voicecall_snd_change_path(papp_snd); + } + } + + voicecall_snd_set_status(papp_snd, VOICE_CALL_AUDIO_SPEAKER, TRUE); + + /* Change Audio Path according to the current status */ + voicecall_snd_change_path(papp_snd); + ret = TRUE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "loudspeacker is already on.\n"); + ret = FALSE; + } +#endif + return ret; +} + +/** + * This function off the loud speaker state + * + * @return gboolean + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_service_loudspeaker_off(call_vc_core_state_t *pcall_core) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core != NULL); + + gboolean bloud_speaker = FALSE; + gboolean ret = FALSE; + voicecall_snd_mgr_t *papp_snd = pcall_core->papp_snd; + int total_call_member = -1; + voicecall_core_get_total_call_member(pcall_core->pcall_engine, &total_call_member); + if (total_call_member == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "There are not active calls hence it should not work \n"); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "\n"); + +#ifdef _NEW_SND_ + if (voicecall_snd_get_path_status(pcall_core->papp_snd) == VOICE_CALL_SND_PATH_SPEAKER) { + if (TRUE == _vc_bt_is_bt_connected(pcall_core)) { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_BT); + /*_vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_SWITCH_TO_HEADSET, -1, NULL);*/ + _vc_bt_request_switch_headset_path(pcall_core, TRUE); + } else { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_RECEIVER); + voicecall_snd_change_path(papp_snd); + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "loudspeacker is already on.\n"); + ret = FALSE; + } +#else + + /* Toggle the LoudSpeaker Status */ + bloud_speaker = voicecall_snd_get_status(papp_snd, VOICE_CALL_AUDIO_SPEAKER); + if (bloud_speaker == TRUE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Change to Speaker Off. \n"); + + voicecall_snd_set_status(papp_snd, VOICE_CALL_AUDIO_SPEAKER, FALSE); + + /* Change Audio Path according to the current status */ + voicecall_snd_change_path(papp_snd); + + ret = TRUE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "loudspeacker is already off.\n"); + ret = FALSE; + } +#endif + + return ret; +} + +/** + * This function is mute on + * + * @return void + * @param[in] pcall_core Handle to voicecall core + */ + +gboolean voicecall_service_mute_status_on(call_vc_core_state_t *pcall_core) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core != NULL); + + gboolean bactive_calls = FALSE; + gboolean bheld_calls = FALSE; + + voicecall_snd_mgr_t *papp_snd = pcall_core->papp_snd; + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + + voicecall_core_is_call_exists(pcall_engine, &bactive_calls, &bheld_calls); + + if (FALSE == bactive_calls && TRUE == bheld_calls) { + CALL_ENG_DEBUG(ENG_DEBUG, "nothing to do.\n"); + /*Mute button should not be handled if only held calls exists */ + return TRUE; + } + + if (FALSE == papp_snd->bmute_status) { + CALL_ENG_DEBUG(ENG_DEBUG, "Setting Voice Audio Mute Status On. \n"); + voicecall_core_set_audio_mute_status(pcall_engine, TRUE); + papp_snd->bmute_status = TRUE; + return TRUE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "mute status is already on.\n"); + return FALSE; + } + +} + +/** + * This function is mute off + * + * @return void + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_service_mute_status_off(call_vc_core_state_t *pcall_core) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core != NULL); + + gboolean bactive_calls = FALSE; + gboolean bheld_calls = FALSE; + + voicecall_snd_mgr_t *papp_snd = pcall_core->papp_snd; + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + + voicecall_core_is_call_exists(pcall_engine, &bactive_calls, &bheld_calls); + + if (FALSE == bactive_calls && TRUE == bheld_calls) { + CALL_ENG_DEBUG(ENG_DEBUG, "nothing to do.\n"); + /*Mute button should not be handled if only held calls exists */ + return TRUE; + } + + if (TRUE == papp_snd->bmute_status) { + CALL_ENG_DEBUG(ENG_DEBUG, "Setting Voice Audio Mute Status Off. \n"); + voicecall_core_set_audio_mute_status(pcall_engine, FALSE); + papp_snd->bmute_status = FALSE; + return TRUE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "mute status is already off.\n"); + return FALSE; + } + +} + +/** + * This function set volume level. + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] vol_alert_type volume alert type + * @param[in] volume_level volume level to be set + */ +gboolean voicecall_service_set_volume(call_vc_core_state_t *pcall_core, voicecall_snd_volume_alert_type_t vol_alert_type, int volume_level) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core != NULL); + + voicecall_snd_mgr_t *papp_snd = pcall_core->papp_snd; + + voicecall_snd_set_volume(papp_snd, vol_alert_type, volume_level); + + return TRUE; +} diff --git a/call-engine/voice-call-sound.c b/call-engine/voice-call-sound.c new file mode 100755 index 0000000..fa24390 --- /dev/null +++ b/call-engine/voice-call-sound.c @@ -0,0 +1,1775 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "voice-call-sound.h" +#include "vc-core-util.h" +#include "vc-core-engine-types.h" +#include "voice-call-core.h" +#include "voice-call-bt.h" +#include "voice-call-service.h" +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#define VOICE_CALL_SND_INVALID_SND_HANDLE -1 /**pcall_core = pcall_core; +#ifdef _NEW_SND_ + psnd_mgr->current_snd_path = VOICE_CALL_SND_PATH_RECEIVER; + psnd_mgr->old_snd_path = VOICE_CALL_SND_PATH_NONE; +#endif + + psnd_mgr->bsound_cm_state = FALSE; + + psnd_mgr->pmm_player = VOICE_CALL_SND_INVALID_PLAYER_HANDLE; + psnd_mgr->pmm_signal_player = VOICE_CALL_SND_INVALID_SND_HANDLE; + + psnd_mgr->mmfsoundplay_handle = VOICE_CALL_SND_INVALID_SND_HANDLE; + psnd_mgr->mmfalternateplay_handle = VOICE_CALL_SND_INVALID_SND_HANDLE; + + psnd_mgr->psignal_play_end_cb = NULL; + psnd_mgr->psignal_play_end_cb_data = NULL; + + /*Return the created Sound Manager */ + *papp_snd = psnd_mgr; + return TRUE; + +} + +void __voicecall_snd_alternate_sound_cb(void *puser_data); +void __voicecall_snd_play_alternate_sound(voicecall_snd_mgr_t *papp_snd); +gboolean __voicecall_snd_stop_alternate_sound(voicecall_snd_mgr_t *papp_snd); + +gboolean __voicecall_snd_alternate_sound_idle_cb(void *puser_data) +{ + voicecall_snd_mgr_t *papp_snd = (voicecall_snd_mgr_t *)puser_data; + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + + if (TRUE == papp_snd->balternate_play) { + if ((FALSE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) + && (TRUE == voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine))) { + /* case : during 2nd incoming call, connected call is cleared. so, just 1 incoming call case... */ + CALL_ENG_DEBUG(ENG_DEBUG, "2nd incoming -> just single incoming call.\n"); + voicecall_snd_prepare_alert(papp_snd, papp_snd->incoming_call_handle); + voicecall_snd_change_mm_path(papp_snd, VOICE_CALL_MM_RING_TONE); + voicecall_snd_play_alert(papp_snd); + } else { + __voicecall_snd_play_alternate_sound(papp_snd); + } + } + + return FALSE; +} + +gboolean __voicecall_snd_alternate_play_timeout_cb(gpointer pdata) +{ + voicecall_snd_mgr_t *papp_snd = (voicecall_snd_mgr_t *)pdata; + + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + if (papp_snd->balternate_play == TRUE) { + __voicecall_snd_play_alternate_sound(papp_snd); + } + + return FALSE; +} + +void __voicecall_snd_play_alternate_sound(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + if (TRUE == voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming call is there!Play Alternate Sound \n"); + + int mmf_error = -1; + + char ring_tone[VOICE_CALL_SND_RINGTONE_PATH_LEN]; + snprintf(ring_tone, sizeof(ring_tone), "file://%s", VOICE_CALL_SND_SECOND_RINGTONE_PATH); + + voicecall_snd_change_mm_path(pcall_core->papp_snd, VOICE_CALL_MM_SECOND_CALL_TONE); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call mm_sound_play_sound to play alternate ringtonen\n"); + mmf_error = mm_sound_play_sound(VOICE_CALL_SND_SECOND_RINGTONE_PATH, VOLUME_TYPE_CALL, __voicecall_snd_alternate_sound_cb, papp_snd, &papp_snd->mmfalternateplay_handle); + + if (MM_ERROR_NONE == mmf_error) { + papp_snd->balternate_play = TRUE; + papp_snd->ringtone_sound_status = VOICE_CALL_SND_STATUS_PLAY; + CALL_ENG_DEBUG(ENG_DEBUG, "Alternate Sound Play Called,papp_snd->balternate_play=%d \n", papp_snd->balternate_play); + } else { + papp_snd->ringtone_sound_status = VOICE_CALL_SND_STATUS_STOP; + papp_snd->balternate_play = FALSE; + CALL_ENG_DEBUG(ENG_DEBUG, "mmf_error = [0x%x] \n", mmf_error); + } + CALL_ENG_DEBUG(ENG_DEBUG, "End of Alternate Sound!\n"); + } +} + +gboolean __voicecall_snd_stop_alternate_sound(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, " papp_snd->balternate_play = %d\n", papp_snd->balternate_play); + if (TRUE == papp_snd->balternate_play) { + /*Only Stop if it is in Play State */ + if (VOICE_CALL_SND_STATUS_PLAY == papp_snd->ringtone_sound_status) { + int error = 0; + error = mm_sound_stop_sound(papp_snd->mmfalternateplay_handle); + papp_snd->mmfalternateplay_handle = -1; + papp_snd->ringtone_sound_status = VOICE_CALL_SND_STATUS_STOP; + CALL_ENG_DEBUG(ENG_ERR, "Alternate Ringtone Stopeed,Error Code: [0x%x] \n", error); + } + papp_snd->balternate_play = FALSE; + return TRUE; + } + return FALSE; +} + +void __voicecall_snd_alternate_sound_cb(void *puser_data) +{ + voicecall_snd_mgr_t *papp_snd = (voicecall_snd_mgr_t *)puser_data; + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + CALL_ENG_DEBUG(ENG_DEBUG, "papp_snd->balternate_play= %d\n", papp_snd->balternate_play); + + papp_snd->ringtone_sound_status = VOICE_CALL_SND_STATUS_STOPPED; + + /*If connected call exists then change the audio path */ + if ((TRUE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) || (TRUE == voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine))) { + voicecall_snd_change_path(papp_snd); + } + + g_timeout_add(VOICE_CALL_SND_2ND_CALL_BEEP_INTERVAL, __voicecall_snd_alternate_sound_idle_cb, papp_snd); + +} + +void voicecall_snd_prepare_alert(voicecall_snd_mgr_t *papp_snd, int call_handle) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + int err_code = -1; + + papp_snd->incoming_call_handle = call_handle; + + if (TRUE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Alternate Sound Needs to be played \n"); + papp_snd->ringtone_sound_status = VOICE_CALL_AND_STATUS_ALTERNATE_PLAY; + return; + } + + /* + Always stop the alert before starting another + to make sure the previous alert is proerly closed. + */ + voicecall_snd_stop_alert(papp_snd); + + /*Initizlize Variables */ + papp_snd->pmm_player = VOICE_CALL_SND_INVALID_PLAYER_HANDLE; + papp_snd->settings_sound_status = FALSE; + papp_snd->settings_vib_status = FALSE; + + err_code = vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &papp_snd->settings_sound_status); + CALL_ENG_DEBUG(ENG_DEBUG, "cur_sound_status = %d, error_code = %d\n", papp_snd->settings_sound_status, err_code); + + err_code = vconf_get_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, &papp_snd->settings_vib_status); + CALL_ENG_DEBUG(ENG_DEBUG, "cur_vib_status = %d, error_code = %d\n", papp_snd->settings_vib_status, err_code); + + if (papp_snd->settings_sound_status == FALSE) + papp_snd->bmute_play = TRUE; + + __voicecall_snd_start_melody(papp_snd, FALSE, call_handle); + +} + +void voicecall_snd_play_alert(voicecall_snd_mgr_t *papp_snd) +{ + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + CALL_ENG_DEBUG(ENG_DEBUG, "papp_snd->ringtone_sound_status=%d \n ", papp_snd->ringtone_sound_status); + + if (VOICE_CALL_AND_STATUS_ALTERNATE_PLAY == papp_snd->ringtone_sound_status) { + if (TRUE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Starting Alternate Sound \n"); + papp_snd->balternate_play_count = 0; + __voicecall_snd_play_alternate_sound(papp_snd); + } + } + + if (VOICE_CALL_SND_STATUS_READY != papp_snd->ringtone_sound_status) { + CALL_ENG_DEBUG(ENG_DEBUG, " Invalid ringtone_sound_status: %d \n ", papp_snd->ringtone_sound_status); + return; + } + + papp_snd->ringtone_sound_status = VOICE_CALL_SND_STATUS_PROCESSED; + + CALL_ENG_DEBUG(ENG_DEBUG, " [##### papp_snd->settings_sound_status #####] : %d \n ", papp_snd->settings_sound_status); + CALL_ENG_DEBUG(ENG_DEBUG, " [##### papp_snd->settings_vib_status #####] : %d \n ", papp_snd->settings_vib_status); + + if (papp_snd->settings_sound_status) { + __voicecall_snd_play_melody(papp_snd, FALSE); + } else if (papp_snd->bmute_play) { + /*Change the path to the earjack headset and play the ringtone */ + voicecall_snd_change_mm_path(papp_snd, VOICE_CALL_MM_MUTE_PLAY); + __voicecall_snd_play_melody(papp_snd, FALSE); + } + if (papp_snd->settings_vib_status) { + __voicecall_snd_start_vibration(papp_snd); + } +} + +#ifdef VOICE_CALL_RINGTONE_ELEVATOR + +gboolean __voicecall_and_start_ring_elevator_cb(gpointer pdata) +{ + voicecall_snd_mgr_t *papp_snd = (voicecall_snd_mgr_t *)pdata; + int volume_level = VOICE_CALL_VOL_LEVEL_1; + int ret_value = -1; + + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + + /*Get the settings current ringtone volume level and set to media player */ + ret_value = vconf_get_int(VCONFKEY_SETAPPL_PROFILE_CURRENT_CALL_VOLUME_INT, &volume_level); + if (ret_value != 0) { + CALL_ENG_DEBUG(ENG_ERR, "settings read failed Error: %d\n", ret_value); + } + CALL_ENG_DEBUG(ENG_DEBUG, "Settings Volume Level = %d\n", volume_level); + + if (papp_snd->pmm_player != VOICE_CALL_SND_INVALID_PLAYER_HANDLE) { + ret_value = mm_sound_volume_set_value(VOLUME_TYPE_RINGTONE, volume_level); + if (MM_ERROR_NONE != ret_value) { + CALL_ENG_DEBUG(ENG_ERR, "Set Volume Error: [0x%x]\n", ret_value); + } + } else { + CALL_ENG_DEBUG(ENG_ERR, "Invalid MM Plauer %d\n", papp_snd->pmm_player); + } + + return FALSE; +} + +void __voicecall_snd_start_ring_elevator(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + + papp_snd->ring_elvator_timerid = g_timeout_add(VOICE_CALL_SND_RING_ELEVATOR_TIME_VAL, __voicecall_and_start_ring_elevator_cb, papp_snd); +} + +void __voicecall_snd_cancel_ring_elevator(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + if (papp_snd->ring_elvator_timerid > 0) { + g_source_remove(papp_snd->ring_elvator_timerid); + papp_snd->ring_elvator_timerid = 0; + } +} +#endif + +gboolean voicecall_snd_mute_alert(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + if (papp_snd->pmm_player != VOICE_CALL_SND_INVALID_PLAYER_HANDLE) { + int ret_value = 0; + + ret_value = mm_player_set_mute(papp_snd->pmm_player, TRUE); + CALL_ENG_DEBUG(ENG_DEBUG, "MM Set Mute Error code: [0x%x] \n", ret_value); + } + + if (TRUE == papp_snd->bvibration) { + CALL_ENG_DEBUG(ENG_DEBUG, "Vibration is playing, stopping vibration \n"); + __voicecall_snd_stop_vibration(papp_snd); + } +#ifdef VOICE_CALL_RINGTONE_ELEVATOR + __voicecall_snd_cancel_ring_elevator(papp_snd); +#endif + + /*Make Vibration than melody flag to FALSE, so melody will not be played when it is muted */ + papp_snd->bvibration_then_melody = FALSE; + + /*Make Increasing Melody flag to FALSE, so melody volume will not be increased when it is muted */ + papp_snd->bincreasingmelody = FALSE; + + return FALSE; +} + +/** + * This function stops the sound alert + * + * @return void + * @param[in] papp_snd Handle to Sound Manager + */ +void voicecall_snd_stop_alert(voicecall_snd_mgr_t *papp_snd) +{ + + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + + __voicecall_snd_stop_vibration(papp_snd); + + if (TRUE == __voicecall_snd_stop_alternate_sound(papp_snd)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Alternate sound stopped \n"); + return; + } +#ifdef VOICE_CALL_RINGTONE_ELEVATOR + /*Stop Ring Elevator */ + __voicecall_snd_cancel_ring_elevator(papp_snd); +#endif + + CALL_ENG_DEBUG(ENG_DEBUG, "pmm_player = %d \n", papp_snd->pmm_player); + if (papp_snd->pmm_player != VOICE_CALL_SND_INVALID_PLAYER_HANDLE) { + int ret_value = 0; + MMPlayerStateType mmplayer_state = MM_PLAYER_STATE_NONE; + + /*Sound Stop requested by the Application */ + papp_snd->ringtone_sound_status = VOICE_CALL_SND_STATUS_STOP; + + mm_player_get_state(papp_snd->pmm_player, &mmplayer_state); + + CALL_ENG_DEBUG(ENG_DEBUG, "Callling mmplayer_stop, current mm state = %d, Player = %d\n", mmplayer_state, papp_snd->pmm_player); + if (MM_PLAYER_STATE_PLAYING == mmplayer_state || MM_PLAYER_STATE_PAUSED == mmplayer_state) { + ret_value = mm_player_stop(papp_snd->pmm_player); + if (MM_ERROR_NONE != ret_value) { + CALL_ENG_DEBUG(ENG_ERR, "mmplayer_stop failed: [0x%x]\n", ret_value); + } + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Callling mmplayer_unrealize, Player = %d\n", papp_snd->pmm_player); + ret_value = mm_player_unrealize(papp_snd->pmm_player); + if (MM_ERROR_NONE != ret_value) { + CALL_ENG_DEBUG(ENG_ERR, "mmplayer_unrealize failed: [0x%x]\n", ret_value); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Callling mmplayer_destroy, Player = %d\n", papp_snd->pmm_player); + ret_value = mm_player_destroy(papp_snd->pmm_player); + if (MM_ERROR_NONE != ret_value) { + CALL_ENG_DEBUG(ENG_ERR, "mmplayer_destroy failed: [0x%x]\n", ret_value); + } + papp_snd->pmm_player = VOICE_CALL_SND_INVALID_PLAYER_HANDLE; + + papp_snd->ringtone_sound_status = VOICE_CALL_SND_STATUS_STOPPED; + } + + /* Stop All periodic Timers */ + papp_snd->bvibration_then_melody = FALSE; + papp_snd->bincreasingmelody = FALSE; + + /* Make the Current Sound Playing Call HAndle Invalid */ + papp_snd->current_playing_call_handle = -1; + + papp_snd->bmute_play = FALSE; +} + +gboolean voicecall_snd_set_play_end_callback(voicecall_snd_mgr_t *papp_snd, voicecall_snd_callback psignal_play_end_cb, gpointer psignal_play_end_cb_data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "signal_type = %d\n", papp_snd->signal_type); + + if (VOICE_CALL_SND_STATUS_NONE == papp_snd->signal_sound_status) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Signal Being Played\n"); + return FALSE; + } + + papp_snd->psignal_play_end_cb = psignal_play_end_cb; + papp_snd->psignal_play_end_cb_data = psignal_play_end_cb_data; + + return TRUE; +} + +/** + * This function plays call sound + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] papp_snd Handle to Sound Manager + */ +gboolean voicecall_snd_is_signal_playing(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "Signal Sound Status : [%d] \n", papp_snd->signal_sound_status); + if ((papp_snd->pmm_signal_player != VOICE_CALL_SND_INVALID_SND_HANDLE) && (VOICE_CALL_SND_STATUS_PLAY == papp_snd->signal_sound_status)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Signal is playing \n"); + return TRUE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Signal is not playing \n"); + return FALSE; +} + +gboolean voicecall_snd_play_signal(voicecall_snd_mgr_t *papp_snd, voicecall_snd_callback psignal_play_end_cb, gpointer psignal_play_end_cb_data) +{ + int ret_value = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, "signal_type = %d\n", papp_snd->signal_type); + + if (VOICE_CALL_SIGNAL_NONE == papp_snd->signal_type) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Signal Type Assinged\n"); + return FALSE; + } + + /* + Always stop the signal before playing another one + This is to make sure that previous signal sound is stopeed completely + */ + voicecall_snd_stop_signal(papp_snd); + + /*Set status, the signal play is being prepared */ + papp_snd->signal_sound_status = VOICE_CALL_SND_STATUS_READY; + CALL_ENG_DEBUG(ENG_DEBUG, "papp_snd->signal_sound_status = %d\n", papp_snd->signal_sound_status); + + papp_snd->psignal_play_end_cb = psignal_play_end_cb; + papp_snd->psignal_play_end_cb_data = psignal_play_end_cb_data; + + if (TRUE == voicecall_snd_is_effect_playing(papp_snd)) { + CALL_ENG_DEBUG(ENG_ERR, "Stopping effect tone to play signal \n "); + voicecall_snd_stop_effect_tone(papp_snd); + } + + CALL_ENG_DEBUG(ENG_ERR, "Changing path to play signal\n "); + voicecall_snd_change_mm_path(papp_snd, VOICE_CALL_MM_SIGNAL_TONE); + CALL_ENG_DEBUG(ENG_ERR, "Changing path to play signal Over\n "); + + CALL_ENG_DEBUG(ENG_DEBUG, "signal_tone = %s\n", papp_snd->signal_tone); + ret_value = mm_sound_play_sound(papp_snd->signal_tone, VOLUME_TYPE_CALL, __voicecall_snd_mmplayer_signal_cb, papp_snd, &papp_snd->pmm_signal_player); + if (MM_ERROR_NONE != ret_value) { + papp_snd->signal_sound_status = VOICE_CALL_SND_STATUS_NONE; + CALL_ENG_DEBUG(ENG_ERR, "mm_sound_play_sound failed,Error: [0x%x]\n", ret_value); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "papp_snd->pmm_signal_player[%d]\n", papp_snd->pmm_signal_player); + papp_snd->signal_sound_status = VOICE_CALL_SND_STATUS_PLAY; + } + CALL_ENG_DEBUG(ENG_DEBUG, "Signal Play Started, Sound Status is: %d\n", papp_snd->signal_sound_status); + + return TRUE; +} + +/** + * This function stops the sound alert + * + * @return void + * @param[in] papp_snd Handle to Sound Manager + */ +void voicecall_snd_stop_signal(voicecall_snd_mgr_t *papp_snd) +{ + int ret_value = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, "Sound Status: %d, papp_snd->pmm_signal_player(%d)\n", papp_snd->signal_sound_status, papp_snd->pmm_signal_player); + if (papp_snd->pmm_signal_player != VOICE_CALL_SND_INVALID_SND_HANDLE) { + if (VOICE_CALL_SND_STATUS_PLAY == papp_snd->signal_sound_status) { + papp_snd->signal_sound_status = VOICE_CALL_SND_STATUS_STOPPED; + + CALL_ENG_DEBUG(ENG_DEBUG, "Stopping Signal Sound \n"); + ret_value = mm_sound_stop_sound(papp_snd->pmm_signal_player); + if (MM_ERROR_NONE != ret_value) { + CALL_ENG_DEBUG(ENG_ERR, "mm_sound_stop_sound failed: [0x%x]\n", ret_value); + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Sound Play Over / Already Stopped \n"); + } + papp_snd->pmm_signal_player = VOICE_CALL_SND_INVALID_SND_HANDLE; + } + if (papp_snd->psignal_play_end_cb != NULL) { + papp_snd->psignal_play_end_cb(papp_snd->psignal_play_end_cb_data); + papp_snd->psignal_play_end_cb = NULL; + papp_snd->psignal_play_end_cb_data = NULL; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Application Sound Status:%d \n", papp_snd->signal_sound_status); +} + +/** + * This function sets the end signal of the given end cause type + * + * @return void + * @param[in] papp_snd Handle to Sound Manager + * @param[in] end_cause_type Type of the end cause + */ +void voicecall_snd_set_signal_type(voicecall_snd_mgr_t *papp_snd, voicecall_snd_signal_type_t signal_type) +{ + char signal_tone[VOICE_CALL_SND_RINGTONE_PATH_LEN]; + + CALL_ENG_DEBUG(ENG_DEBUG, "Signal Type: %d\n", signal_type); + + memset(signal_tone, 0, sizeof(signal_tone)); + + papp_snd->signal_type = signal_type; + switch (papp_snd->signal_type) { + case VOICE_CALL_SIGNAL_USER_BUSY_TONE: + { + _vc_core_util_strcpy(signal_tone, VOICE_CALL_SND_RINGTONE_PATH_LEN, VOICE_CALL_SND_USER_BUSY_SIGNAL_PATH); + } + break; + case VOICE_CALL_SIGNAL_WRONG_NUMBER_TONE: + { + _vc_core_util_strcpy(signal_tone, VOICE_CALL_SND_RINGTONE_PATH_LEN, VOICE_CALL_SND_ERROR_SIGNAL_PATH); + } + break; + case VOICE_CALL_SIGNAL_CALL_FAIL_TONE: + case VOICE_CALL_SIGNAL_NW_CONGESTION_TONE: + { + _vc_core_util_strcpy(signal_tone, VOICE_CALL_SND_RINGTONE_PATH_LEN, VOICE_CALL_SND_NW_CONGESTION_SIGNAL_PATH); + } + break; + default: + CALL_ENG_DEBUG(ENG_ERR, "Invalid Signal Type \n"); + break; + } + + _vc_core_util_strcpy(papp_snd->signal_tone, sizeof(papp_snd->signal_tone), signal_tone); + +} + +static void __voicecall_snd_get_voice_path(voicecall_snd_mgr_t *papp_snd, int *voice_snd_path) +{ + voicecall_audio_path_t tmp_audio_path; + +#ifdef _NEW_SND_ + CALL_ENG_DEBUG(ENG_DEBUG, "current path = %d\n", voicecall_snd_get_path_status(papp_snd)); + + switch (voicecall_snd_get_path_status(papp_snd)) { + case VOICE_CALL_SND_PATH_BT: + { + tmp_audio_path = VC_AUDIO_PATH_BLUETOOTH; + } + break; + case VOICE_CALL_SND_PATH_SPEAKER: + { + tmp_audio_path = VC_AUDIO_PATH_SPK_PHONE; + } + break; + case VOICE_CALL_SND_PATH_EARJACK: + { + tmp_audio_path = VC_AUDIO_PATH_HEADSET; + } + break; + case VOICE_CALL_SND_PATH_RECEIVER: + default: + { + tmp_audio_path = VC_AUDIO_PATH_HANDSET; + } + } +#else + CALL_ENG_DEBUG(ENG_DEBUG, "Headset Status = %d\n", papp_snd->bcall_audio_status[VOICE_CALL_AUDIO_HEADSET]); + CALL_ENG_DEBUG(ENG_DEBUG, "Loud Speaker Status = %d\n", papp_snd->bcall_audio_status[VOICE_CALL_AUDIO_SPEAKER]); + + /*Priority is given to Headset, incase both loudspeaker and headset is enabled */ + if (TRUE == papp_snd->bcall_audio_status[VOICE_CALL_AUDIO_HEADSET]) { + tmp_audio_path = VC_AUDIO_PATH_BLUETOOTH; + } else if (TRUE == papp_snd->bcall_audio_status[VOICE_CALL_AUDIO_SPEAKER]) { + tmp_audio_path = VC_AUDIO_PATH_SPK_PHONE; + } else if (TRUE == papp_snd->bcall_audio_status[VOICE_CALL_AUDIO_EARJACK]) { + tmp_audio_path = VC_AUDIO_PATH_HEADSET; + } else { + tmp_audio_path = VC_AUDIO_PATH_HANDSET; + } +#endif + *voice_snd_path = tmp_audio_path; + + CALL_ENG_DEBUG(ENG_DEBUG, "voice_snd_path = %d\n", *voice_snd_path); + +} + +void voicecall_snd_change_mm_path(voicecall_snd_mgr_t *papp_snd, voicecall_snd_mm_path_type_t mm_path_type) +{ + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + int in_path = 0; + int out_path = 0; + int gain_type = 0; + int mm_error = 0; + int option_field = MM_SOUND_PATH_OPTION_AUTO_HEADSET_CONTROL; + + CALL_ENG_DEBUG(ENG_DEBUG, "mm_path_type = %d\n", mm_path_type); + CALL_ENG_DEBUG(ENG_DEBUG, "papp_snd->current_path_type = %d\n", papp_snd->current_path_type); + +#ifdef _NEW_SND_ + switch (voicecall_snd_get_path_status(papp_snd)) { + case VOICE_CALL_SND_PATH_BT: + { + out_path = MM_SOUND_PATH_BTHEADSET; + in_path = MM_SOUND_PATH_BTMIC; + } + break; + case VOICE_CALL_SND_PATH_SPEAKER: + { + out_path = MM_SOUND_PATH_SPK; + in_path = MM_SOUND_PATH_MIC; + option_field = MM_SOUND_PATH_OPTION_NONE; + } + break; + case VOICE_CALL_SND_PATH_EARJACK: + case VOICE_CALL_SND_PATH_RECEIVER: + default: + { + out_path = MM_SOUND_PATH_RECV; + in_path = MM_SOUND_PATH_MIC; + } + break; + } + +#else + /*Define OutPath */ + if (TRUE == papp_snd->bcall_audio_status[VOICE_CALL_AUDIO_HEADSET]) { + out_path = MM_SOUND_PATH_BTHEADSET; + } else if (TRUE == papp_snd->bcall_audio_status[VOICE_CALL_AUDIO_SPEAKER]) { + out_path = MM_SOUND_PATH_SPK; + option_field = MM_SOUND_PATH_OPTION_NONE; + } else { /*Normal Phone Reciever */ + + out_path = MM_SOUND_PATH_RECV; + } + + if (TRUE == papp_snd->bcall_audio_status[VOICE_CALL_AUDIO_HEADSET]) { + in_path = MM_SOUND_PATH_BTMIC; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Don't off the MIC. Mute only modem\n"); + in_path = MM_SOUND_PATH_MIC; + } +#endif + + CALL_ENG_DEBUG(ENG_DEBUG, "Out Path = %d, In Path = %d \n", out_path, in_path); + + /* This patch is required : if voice path is not reset, + * the volume played for ringtone and signal tone will not be audible enough to hear + */ + if ((VOICE_CALL_MM_VOICE == papp_snd->current_path_type) && ((VOICE_CALL_MM_RING_TONE == mm_path_type) || (VOICE_CALL_MM_SIGNAL_TONE == mm_path_type))) { + CALL_ENG_DEBUG(ENG_DEBUG, "Resetting Voice Path before changing to some other path \n"); + } + + /*Define Gain Type */ + switch (mm_path_type) { + case VOICE_CALL_MM_ALERT_TONE: + { + gain_type = MM_SOUND_GAIN_CALLTONE; + in_path = MM_SOUND_PATH_NONE; + } + break; + case VOICE_CALL_MM_SECOND_CALL_TONE: + { + /* MMFW sound request. always set it. */ + gain_type = MM_SOUND_GAIN_KEYTONE; /* In case of earjack inserting, during second call */ + in_path = MM_SOUND_PATH_NONE; + } + break; + case VOICE_CALL_MM_RING_TONE: + { + int io_state = VC_INOUT_STATE_NONE; + + gain_type = MM_SOUND_GAIN_RINGTONE; + in_path = MM_SOUND_PATH_NONE; + option_field = MM_SOUND_PATH_OPTION_SPEAKER_WITH_HEADSET; + + voicecall_core_get_engine_state(pcall_engine, &io_state); + if ((voicecall_core_is_incoming_call_exists(pcall_engine)) && (io_state != VC_INOUT_STATE_INCOME_END)) { + out_path = MM_SOUND_PATH_SPK; + } + } + break; + case VOICE_CALL_MM_MUTE_PLAY: + { + gain_type = MM_SOUND_GAIN_RINGTONE; + in_path = MM_SOUND_PATH_NONE; + out_path = MM_SOUND_PATH_HEADSET; + } + break; + case VOICE_CALL_MM_RESET: + { + gain_type = MM_SOUND_GAIN_VOICECALL; + in_path = MM_SOUND_PATH_NONE; + out_path = MM_SOUND_PATH_NONE; + } + break; + case VOICE_CALL_MM_SIGNAL_TONE: + { + gain_type = MM_SOUND_GAIN_CALLTONE; + in_path = MM_SOUND_PATH_NONE; + } + break; + case VOICE_CALL_MM_RECORD: + { + gain_type = MM_SOUND_GAIN_VOICECALL; + } + break; + case VOICE_CALL_MM_VOICE: + { + gain_type = MM_SOUND_GAIN_VOICECALL; + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Invalid MM Path Type: %d\n", mm_path_type); + } + + if (papp_snd->bsound_cm_state == TRUE) { + CALL_ENG_DEBUG(ENG_DEBUG, "mm_sound_set_path- Gain:[%d],OutPath:[%d],InPath:[%d],option:[%d] \n", gain_type, out_path, in_path, option_field); + CALL_ENG_KPI("mm_sound_set_path start"); + mm_error = mm_sound_set_path(gain_type, out_path, in_path, option_field); + CALL_ENG_KPI("mm_sound_set_path done"); + if (mm_error != MM_ERROR_NONE) { + CALL_ENG_DEBUG(ENG_ERR, "MM Path Change Failed,mm_error = [0x%x]\n", mm_error); + } + papp_snd->current_path_type = mm_path_type; + } else { + CALL_ENG_DEBUG(ENG_ERR, "** we can't change mm path. check it. **** \n"); + } + +} + +/** + * This function changes the sound path according to the current status + * + * @return void + * @param[in] papp_snd Handle to Sound Manager + */ +void voicecall_snd_change_path(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + CALL_ENG_KPI("voicecall_snd_change_path start"); + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + +#ifdef _NEW_SND_ + if (voicecall_snd_get_path_status(papp_snd) == VOICE_CALL_SND_PATH_BT) { + int bt_sco_status = 0; + + bt_sco_status = _vc_bt_get_bt_sco_status(); + if (FALSE == bt_sco_status) { + gboolean bevent_wait = FALSE; + + CALL_ENG_DEBUG(ENG_ERR, "BT Sco is OFF, request BT for path change\n"); + bevent_wait = voicecall_core_get_status(pcall_core, CALL_VC_CORE_FLAG_BT_EVENT_WAITING); + if (FALSE == bevent_wait) { + /*Request BT for change path to headset */ + _vc_bt_request_switch_headset_path(pcall_core, TRUE); + } else { + CALL_ENG_DEBUG(ENG_ERR, "bevent_wait = %d, waiting for BT Event \n", bevent_wait); + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "BT SCO is open, Change the path to sync with BT Path\n"); + voicecall_snd_change_path_real(papp_snd); + } + }else { + CALL_ENG_DEBUG(ENG_DEBUG, "new PATH is not BT."); + gboolean bevent_wait = FALSE; + + bevent_wait = voicecall_core_get_status(pcall_core, CALL_VC_CORE_FLAG_BT_EVENT_WAITING); + if (FALSE == bevent_wait) { + /*Request BT for change path to headset */ + voicecall_snd_change_path_real(papp_snd); + } else { + CALL_ENG_DEBUG(ENG_ERR, "bevent_wait = %d, waiting for BT Event \n", bevent_wait); + } + } +#else + if ((TRUE == _vc_bt_is_bt_connected(pcall_core)) + && (TRUE == papp_snd->bcall_audio_status[VOICE_CALL_AUDIO_HEADSET])) { + + int bt_sco_status = 0; + + bt_sco_status = _vc_bt_get_bt_sco_status(); + if (FALSE == bt_sco_status) { + gboolean bevent_wait = FALSE; + + CALL_ENG_DEBUG(ENG_ERR, "BT Sco is OFF, request BT for path change\n"); + bevent_wait = voicecall_core_get_status(pcall_core, CALL_VC_CORE_FLAG_BT_EVENT_WAITING); + if (FALSE == bevent_wait) { + /*Request BT for change path to headset */ + _vc_bt_request_switch_headset_path(pcall_core, TRUE); + } else { + CALL_ENG_DEBUG(ENG_ERR, "bevent_wait = %d, waiting for BT Event \n", bevent_wait); + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "BT SCO is open, Change the path to sync with BT Path\n"); + voicecall_snd_change_path_real(papp_snd); + } + } else if ((TRUE == _vc_bt_is_bt_connected(pcall_core)) && (TRUE == voicecall_core_get_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT))) { + /*Request BT for change path to headset, actual voice path will be changed in the response from BT */ + CALL_ENG_DEBUG(ENG_ERR, "Headset Connected Call is accepted by BT, requesting BT to change path\n"); + _vc_bt_request_switch_headset_path(pcall_core, TRUE); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "No Headset connected/Headset connected call accepted by Phone, Normal Path Change..\n"); + voicecall_snd_change_path_real(papp_snd); + } +#endif + CALL_ENG_KPI("voicecall_snd_change_path done"); + +} + +void voicecall_snd_change_path_real(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + + /* Change the mm sound path */ + voicecall_snd_change_mm_path(papp_snd, VOICE_CALL_MM_VOICE); + + voicecall_snd_change_modem_path(papp_snd); +} + +void voicecall_snd_change_modem_path(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + int audio_path = VC_AUDIO_PATH_HANDSET; + + /* Change the tapi sound path */ + __voicecall_snd_get_voice_path(papp_snd, &audio_path); + + if (FALSE == voicecall_core_change_audio_path(pcall_core->pcall_engine, audio_path)) { + CALL_ENG_DEBUG(ENG_ERR, "TAPI Audio Change Path ERROR \n"); + } +} + +/** + * This function sets the status of the given call audio type + * + * @return void + * @param[in] papp_snd Handle to Sound Manager + * @param[in] snd_audio_type Type of the Device to be changed + * @param[in] status Status, TRUE - Enable, FALSE -Disable + */ +void voicecall_snd_set_status(voicecall_snd_mgr_t *papp_snd, voicecall_snd_audio_type_t snd_audio_type, gboolean status) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "snd_audio_type:[%d], status:[%d]\n", snd_audio_type, status); + + /*if BT headset is connected , switch off loud speaker - it will be reflectd in the next sound path change */ + if (((VOICE_CALL_AUDIO_HEADSET == snd_audio_type) || (VOICE_CALL_AUDIO_EARJACK == snd_audio_type)) && (TRUE == status)) { + CALL_ENG_DEBUG(ENG_DEBUG, "loud speaker status is to be FALSE\n"); + papp_snd->bcall_audio_status[VOICE_CALL_AUDIO_SPEAKER] = FALSE; + } + papp_snd->bcall_audio_status[snd_audio_type] = status; +} + +/** + * This function returns the current status of the given call audio type + * + * @return Returns TRUE if given call audio type is enables or FALSE otherwise + * @param[in] papp_snd Handle to Sound Manager + * @param[in] snd_audio_type Type of the Device to be changed + */ +gboolean voicecall_snd_get_status(voicecall_snd_mgr_t *papp_snd, voicecall_snd_audio_type_t snd_audio_type) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "Status[%d] = %d \n", snd_audio_type, papp_snd->bcall_audio_status[snd_audio_type]); + return papp_snd->bcall_audio_status[snd_audio_type]; +} + +#ifdef _NEW_SND_ +/** + * This function sets the status of the given call audio type + * + * @return void + * @param[in] papp_snd Handle to Sound Manager + * @param[in] snd_audio_type Type of the Device to be changed + * @param[in] status Status, TRUE - Enable, FALSE -Disable + */ +void voicecall_snd_set_path_status(voicecall_snd_mgr_t *papp_snd, voicecall_snd_path_t path) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "current path:[%d], new path:[%d]\n", papp_snd->current_snd_path, path); + + papp_snd->old_snd_path = papp_snd->current_snd_path; + papp_snd->current_snd_path = path; +} + +voicecall_snd_path_t voicecall_snd_get_path_status(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "old path:[%d], current path:[%d]\n", papp_snd->old_snd_path, papp_snd->current_snd_path); + + return papp_snd->current_snd_path; +} +#endif + +/** +* This function sets the volume level for the given volume alert type +* +* @return void +* @param[in] papp_snd Handle to Sound Manager +* @param[in] vol_alert_type volume alert type #voicecall_snd_volume_alert_type_t +* @param[in] volume_level volume level to be set +*/ +void voicecall_snd_set_volume(voicecall_snd_mgr_t *papp_snd, voicecall_snd_volume_alert_type_t vol_alert_type, int volume_level) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "volume_level = %d \n", volume_level); + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + switch (vol_alert_type) { + case VOICE_CALL_VOL_TYPE_RINGTONE: + { + int ret_value = 0; + int volume; + + if (VOICE_CALL_SND_INVALID_PLAYER_HANDLE == papp_snd->pmm_player) { + CALL_ENG_DEBUG(ENG_ERR, "Invalid MM Player Handle \n"); + return; + } + + /* Make Increasing Melody flag to FALSE, so melody volume will not be increased when volume it adjusted by user during increasing melody */ + papp_snd->bincreasingmelody = FALSE; + + volume = volume_level; + + ret_value = mm_sound_volume_set_value(VOLUME_TYPE_RINGTONE, volume); + if (MM_ERROR_NONE != ret_value) { + CALL_ENG_DEBUG(ENG_ERR, "mmplayer_set_volume failed Error: [0x%x]\n", ret_value); + } +#ifdef VOICE_CALL_RINGTONE_ELEVATOR + __voicecall_snd_cancel_ring_elevator(papp_snd); +#endif + } + break; + case VOICE_CALL_VOL_TYPE_VOICE: + { + int incall_vol_level = 0; + int audio_path = 0; + + if (VOICE_CALL_VOL_LEVEL_1 >= volume_level) { + incall_vol_level = VOICE_CALL_VOL_LEVEL_1; + } else if (VOICE_CALL_VOL_LEVEL_6 < volume_level) { + incall_vol_level = VOICE_CALL_VOL_LEVEL_6; + } else { + incall_vol_level = volume_level; + } + + __voicecall_snd_get_voice_path(papp_snd, &audio_path); + + _vc_core_util_set_call_volume(volume_level); + + /* MODEM want to get volume level as 0~5, not a 1~6. So pass -1 value */ + if (FALSE == voicecall_core_set_audio_volume(pcall_core->pcall_engine, audio_path, (incall_vol_level-1))) { + CALL_ENG_DEBUG(ENG_DEBUG, "voicecall_doc_set_audio_volume failed\n"); + } + } + break; + case VOICE_CALL_VOL_TYPE_HEADSET: + { + int bt_vol_level = 0; + if (TRUE == voicecall_core_get_status(pcall_core, CALL_VC_CORE_FLAG_VOL_CHNGD_BYBT)) { + CALL_ENG_DEBUG(ENG_DEBUG, "BT Requested Volume flag is enabled, not sending response \n"); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_VOL_CHNGD_BYBT, FALSE); + } else { + bt_vol_level = volume_level; + CALL_ENG_DEBUG(ENG_DEBUG, "bt_vol_level = %d\n", bt_vol_level); + + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_SPK_GAIN, bt_vol_level, NULL); + } + + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "No Actions Defined for the volume alert type: %d \n", vol_alert_type); + + } +} + +/** + * This function retreives the volume according to the given volume alert type + * + * @return current volume level + * @param[in] papp_snd Handle to Sound Manager + * @param[in] vol_alert_type volume alert type #voicecall_snd_volume_alert_type_t + */ +int voicecall_snd_get_volume(voicecall_snd_mgr_t *papp_snd, voicecall_snd_volume_alert_type_t vol_alert_type) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "\n"); + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + switch (vol_alert_type) { + case VOICE_CALL_VOL_TYPE_RINGTONE: + { + int ret_val = 0; + unsigned int volume = 0; + + ret_val = mm_sound_volume_get_value(VOLUME_TYPE_RINGTONE, &volume); + if (MM_ERROR_NONE != ret_val) { + CALL_ENG_DEBUG(ENG_DEBUG, "ret_val = [0x%x]\n", ret_val); + return VC_INVALID_VOLUME; + } + CALL_ENG_DEBUG(ENG_DEBUG, "MM Volume Level : %d\n", volume); + + return volume; + + } + break; + case VOICE_CALL_VOL_TYPE_VOICE: + { + return _vc_core_util_get_call_volume(); + } + break; + case VOICE_CALL_VOL_TYPE_HEADSET: + { + _vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_HEADSET_VOL, 0, NULL); + return VC_INVALID_VOLUME; /*Return Invalid Volume level as default */ + } + break; + default: + return VC_INVALID_VOLUME; /*Return Invalid Volume level as default */ + } + + return VC_INVALID_VOLUME; +} + +gboolean voicecall_snd_get_alternate_play(voicecall_snd_mgr_t *papp_snd) +{ + return papp_snd->balternate_play; +} + +static gboolean __voicecall_snd_start_melody(voicecall_snd_mgr_t *papp_snd, gboolean bis_increasing, int call_handle) +{ + char *setting_file_path = NULL; + char ringtone_path[VOICE_CALL_SND_RINGTONE_PATH_LEN] = { 0, }; + call_vc_call_objectinfo_t callobject_info; + voicecall_contact_info_t ct_info; + + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle = %d\n", call_handle); + + CALL_ENG_DEBUG(ENG_DEBUG, "Contact ring_tone_path = [%s]\n", papp_snd->ring_tone); + + if (strlen(papp_snd->ring_tone) <= 0) { + setting_file_path = vconf_get_str(VCONFKEY_SETAPPL_CALL_RINGTONE_PATH_STR); + if ((setting_file_path == NULL) || (strlen(setting_file_path) <= 0) || + (FALSE == g_file_test(setting_file_path, G_FILE_TEST_EXISTS))) + { + CALL_ENG_DEBUG(ENG_ERR, "setting ring tone path is invalid : [%s]\n", setting_file_path); + /*snprintf(ringtone_path, sizeof(ringtone_path), "file://%s", VOICE_CALL_SND_DEFAULT_RINGTONE_PATH);*/ + return; + } else { + snprintf(ringtone_path, sizeof(ringtone_path), "file://%s", setting_file_path); + + } + CALL_ENG_DEBUG(ENG_DEBUG, "Ringtone From Settings : %s\n", ringtone_path); + _vc_core_util_strcpy(papp_snd->ring_tone, sizeof(papp_snd->ring_tone), ringtone_path); + } + + /* Create MM Player */ + papp_snd->pmm_player = VOICE_CALL_SND_INVALID_PLAYER_HANDLE; + __voicecall_snd_create_player(papp_snd, &papp_snd->pmm_player, VOICE_CALL_PLAY_TYPE_RINGTONE); + + papp_snd->ringtone_sound_status = VOICE_CALL_SND_STATUS_READY; + + return TRUE; +} + +static gboolean __voicecall_snd_create_player(voicecall_snd_mgr_t *papp_snd, MMHandleType * pPlayer, voicecall_snd_play_type_t play_type) +{ + int ret_value = 0; + MMMessageCallback callback = NULL; + char *mmf_error = NULL; + + CALL_ENG_DEBUG(ENG_DEBUG, "Start..\n"); + + if (*pPlayer != VOICE_CALL_SND_INVALID_SND_HANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Player = %d \n", *pPlayer); + mm_player_destroy(*pPlayer); + *pPlayer = VOICE_CALL_SND_INVALID_SND_HANDLE; + } + + ret_value = mm_player_create(pPlayer); + if (MM_ERROR_NONE != ret_value || *pPlayer == VOICE_CALL_SND_INVALID_SND_HANDLE) { + CALL_ENG_DEBUG(ENG_ERR, "mmplayer_create failed , Error:[0x%x]\n", ret_value); + return FALSE; + } + CALL_ENG_DEBUG(ENG_DEBUG, "*pPlayer: %d\n", *pPlayer); + + switch (play_type) { + /*Set the MM Player Attributes according to the Display Priority Type */ + case VOICE_CALL_PLAY_TYPE_RINGTONE: + { + mm_player_set_attribute(*pPlayer, &mmf_error, + "sound_volume_type", MM_SOUND_VOLUME_TYPE_RINGTONE, + "profile_uri", papp_snd->ring_tone, VOICE_CALL_SND_RINGTONE_PATH_LEN, + "profile_play_count", -1, "sound_route", MM_AUDIOROUTE_USE_EXTERNAL_SETTING, "sound_spk_out_only", TRUE, "sound_stop_when_unplugged", FALSE, NULL); + callback = __voicecall_snd_mmplayer_cb; + + } + break; + default: + break; + } + + mm_player_set_message_callback(*pPlayer, callback, papp_snd); + + ret_value = mm_player_realize(*pPlayer); + if (MM_ERROR_NONE != ret_value) { + CALL_ENG_DEBUG(ENG_ERR, "mmplayer_realize failed , Error:[0x%x]\n", ret_value); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Finish..\n"); + return TRUE; +} + +static gboolean __voicecall_snd_play_melody(voicecall_snd_mgr_t *papp_snd, gboolean bis_increasing) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + + if (strlen(papp_snd->ring_tone) > 0) { + int mm_error = MM_ERROR_NONE; + + mm_error = mm_player_start(papp_snd->pmm_player); + if (MM_ERROR_NONE != mm_error) { + CALL_ENG_DEBUG(ENG_ERR, "mm_player_start failed,Error: [0x%x]\n", mm_error); + } else { + if (TRUE == bis_increasing) { + papp_snd->bincreasingmelody = TRUE; + g_timeout_add(VOICE_CALL_SND_INCREMENT_TIMER_INTERVAL, __voicecall_snd_increasing_melody_cb, (gpointer) papp_snd); + } else { +#ifdef VOICE_CALL_RINGTONE_ELEVATOR + CALL_ENG_DEBUG(ENG_DEBUG, "Starting Ringtone Elevator\n"); + /*Start only when the volume is not incremental volume */ + __voicecall_snd_start_ring_elevator(papp_snd); +#endif + } + + papp_snd->ringtone_sound_status = VOICE_CALL_SND_STATUS_PLAY; + return TRUE; + } + } else { + CALL_ENG_DEBUG(ENG_ERR, "Ringtone is empty(Problem) \n"); + } + + return FALSE; +} + +static int __voicecall_snd_mmplayer_cb(int message, void *data, void *user_data) +{ + voicecall_snd_mgr_t *papp_snd = (voicecall_snd_mgr_t *)user_data; + if (VOICE_CALL_SND_STATUS_PLAY != papp_snd->ringtone_sound_status) { + CALL_ENG_DEBUG(ENG_DEBUG, "Sound Play stopped by application, callback not handled \n"); + return FALSE; + } + + switch (message) { + case MM_MESSAGE_END_OF_STREAM: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Ringtone loop count is supported by MMF , need not restart the ringtone \n"); + } + break; + default: + return FALSE; + break; + } + return TRUE; +} + +gboolean __voicecall_snd_mmplayer_signal_end_callback_idle_cb(gpointer pdata) +{ + voicecall_snd_mgr_t *papp_snd = (voicecall_snd_mgr_t *)pdata; + + CALL_ENG_DEBUG(ENG_DEBUG, " \n"); + + /*Callback needs to be called, only when the tone is played completely and it is ended + if the signal is explictly stopped, don't call the user callback */ + if (papp_snd->psignal_play_end_cb != NULL) { + CALL_ENG_DEBUG(ENG_DEBUG, "Calling user callback \n"); + papp_snd->psignal_play_end_cb(papp_snd->psignal_play_end_cb_data); + papp_snd->psignal_play_end_cb = NULL; + papp_snd->psignal_play_end_cb_data = NULL; + } + + return FALSE; +} + +static void __voicecall_snd_mmplayer_signal_cb(gpointer puser_data) +{ + voicecall_snd_mgr_t *papp_snd = (voicecall_snd_mgr_t *)puser_data; + + CALL_ENG_DEBUG(ENG_DEBUG, "Sound Play Over \n"); + + if (papp_snd->signal_sound_status != VOICE_CALL_SND_STATUS_PLAY) { + CALL_ENG_DEBUG(ENG_DEBUG, "Sound Play already stopped by application \n"); + return; + } + + papp_snd->signal_sound_status = VOICE_CALL_SND_STATUS_STOPPED; + + __voicecall_snd_mmplayer_signal_end_callback_idle_cb(papp_snd); +} + +static gboolean __voicecall_snd_increasing_melody_cb(void *data) +{ + voicecall_snd_mgr_t *papp_snd = (voicecall_snd_mgr_t *)data; + int ret_value = 0; + int set_volume_level = VOICE_CALL_VOL_LEVEL_1; + + if (FALSE == papp_snd->bincreasingmelody) { + CALL_ENG_DEBUG(ENG_DEBUG, "Already Deactivated\n"); + return FALSE; + } + + if (FALSE == vconf_get_int(VCONFKEY_SETAPPL_PROFILE_CURRENT_CALL_VOLUME_INT, &set_volume_level)) { + CALL_ENG_DEBUG(ENG_ERR, "settings read failed Error: %d\n", ret_value); + } + + if ((set_volume_level != 0) && (papp_snd->increment_melody_value <= set_volume_level)) { + int volume_val; + + papp_snd->increment_melody_value++; + + volume_val = papp_snd->increment_melody_value; + ret_value = mm_sound_volume_set_value(VOLUME_TYPE_RINGTONE, volume_val); + + if (MM_ERROR_NONE != ret_value) { + CALL_ENG_DEBUG(ENG_ERR, "Set Volume Error: [0x%x]\n", ret_value); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Increasing Melody Continuing, Current Increased Melody : %d\n", papp_snd->increment_melody_value); + if (papp_snd->increment_melody_value >= set_volume_level) { + CALL_ENG_DEBUG(ENG_DEBUG, "Increasing Melody Ended\n"); + return FALSE; + } + + return TRUE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Increasing Melody Ended\n"); + return FALSE; +} + +static void __voicecall_snd_start_vibration(voicecall_snd_mgr_t *papp_snd) +{ + /*First Stop the previous Vibration and then start it again */ + + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + int vib_type = -1; + int vib_level = -1; + int haptic_vib_type = -1; + + papp_snd->bvibration = FALSE; + + papp_snd->vibration_handle = device_haptic_open(DEV_IDX_0, 0); + + CALL_ENG_DEBUG(ENG_DEBUG, "srart vibration device_handle=%d \n", papp_snd->vibration_handle); + + if (papp_snd->vibration_handle < 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "device_haptic_open error \n"); + return; + } + + if (vconf_get_int(VCONFKEY_SETAPPL_CALL_VIBRATION_PATTERN_INT, &vib_type)) { + CALL_ENG_DEBUG(ENG_ERR, "VCONFKEY_SETAPPL_CALL_VIBRATION_PATTERN_INT vconf_get_bool failed.\n"); + } + if (vconf_get_int(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, &vib_level)) { + CALL_ENG_DEBUG(ENG_ERR, "VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT vconf_get_bool failed.\n"); + } + + if (vib_level > 5) + vib_level = 5; + + switch (vib_type) { + case SETTING_CALL_ALERT_VIB_TYPE1: + haptic_vib_type = EFFCTVIBE_INCOMING_CALL01; + break; + case SETTING_CALL_ALERT_VIB_TYPE2: + haptic_vib_type = EFFCTVIBE_INCOMING_CALL02; + break; + case SETTING_CALL_ALERT_VIB_TYPE3: + haptic_vib_type = EFFCTVIBE_INCOMING_CALL03; + break; + default: + haptic_vib_type = EFFCTVIBE_INCOMING_CALL01; + break; + } + if (device_haptic_play_pattern(papp_snd->vibration_handle, haptic_vib_type, 255, vib_level)) { + CALL_ENG_DEBUG(ENG_DEBUG, "device_haptic_play_pattern error \n"); + return; + } + if (device_haptic_play_monotone(papp_snd->vibration_handle, 60000)) { + CALL_ENG_DEBUG(ENG_DEBUG, "device_haptic_play_monotone error \n"); + return; + } + + papp_snd->bvibration = TRUE; + +} + +static gboolean __voicecall_snd_vib_then_melody_cb(void *data) +{ + voicecall_snd_mgr_t *papp_snd = (voicecall_snd_mgr_t *)data; + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + __voicecall_snd_stop_vibration(papp_snd); + + if (FALSE == papp_snd->bvibration_then_melody) { + return FALSE; + } + + if (FALSE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) { + + int ret_value = -1; + int set_volume_level = 0; + int volume_val; + + vconf_get_int(VCONFKEY_SETAPPL_PROFILE_CURRENT_CALL_VOLUME_INT, &set_volume_level); + + volume_val = set_volume_level; + + ret_value = mm_sound_volume_set_value(VOLUME_TYPE_RINGTONE, volume_val); + + CALL_ENG_DEBUG(ENG_ERR, "__voicecall_snd_vib_then_melody_cb() : volume = %d\n", volume_val); + + __voicecall_snd_play_melody(papp_snd, FALSE); + } + + return FALSE; +} + +static void __voicecall_snd_stop_vibration(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "..\n"); + + if (TRUE == papp_snd->bvibration) { + CALL_ENG_DEBUG(ENG_DEBUG, "Stopping Vibration , handle=%d \n", papp_snd->vibration_handle); + + if (device_haptic_stop_play(papp_snd->vibration_handle)) { + CALL_ENG_DEBUG(ENG_DEBUG, "device_haptic_play_stop error \n"); + return; + } + + if (device_haptic_close(papp_snd->vibration_handle)) { + CALL_ENG_DEBUG(ENG_DEBUG, "device_haptic_close error \n"); + return; + } + + papp_snd->vibration_handle = -1; + + papp_snd->bvibration = FALSE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "bvibration is not enabled.\n"); + } + +} + +/* +* This function is callback of mm_sound_route_add_callback +* @return void +* @param[in] data call user data +* policy system audio route policy which has applied. +*/ +void voicecall_snd_route_change_cb(void *data, system_audio_route_t policy) +{ + int error_code = 0; + CALL_ENG_DEBUG(ENG_ERR, "System audio route policy has changed"); + if (policy != SYSTEM_AUDIO_ROUTE_POLICY_IGNORE_A2DP) { + error_code = mm_sound_route_set_system_policy(SYSTEM_AUDIO_ROUTE_POLICY_IGNORE_A2DP); + if (error_code) { + CALL_ENG_DEBUG(ENG_ERR, "mm_sound_route_set_system_policy failed. error_code:[0x%x]\n", error_code); + } + } +} + +/** +* This function unregisters the application with the sound conflict manager +* +* @return void +* @param[in] papp_snd Handle to Sound Manager +*/ +void voicecall_snd_register_cm(voicecall_snd_mgr_t *papp_snd) +{ + int error_code = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, "current bsound_cm_state:[%d]. \n", papp_snd->bsound_cm_state); + + if (FALSE == papp_snd->bsound_cm_state) { + CALL_ENG_KPI("mm_session_init start"); + error_code = mm_session_init(MM_SESSION_TYPE_CALL); + CALL_ENG_KPI("mm_session_init done"); + if (error_code) { + CALL_ENG_DEBUG(ENG_ERR, "mm_session_init failed. error_code:[0x%x]\n", error_code); + return; + } + error_code = mm_sound_route_get_system_policy(&papp_snd->backup_route_policy); + if (error_code) { + CALL_ENG_DEBUG(ENG_ERR, "mm_sound_route_get_system_policy failed. error_code:[0x%x]\n", error_code); + return; + } + error_code = mm_sound_route_set_system_policy(SYSTEM_AUDIO_ROUTE_POLICY_IGNORE_A2DP); + if (error_code) { + CALL_ENG_DEBUG(ENG_ERR, "mm_sound_route_set_system_policy failed. error_code:[0x%x]\n", error_code); + return; + } + error_code = mm_sound_route_add_change_callback(voicecall_snd_route_change_cb, NULL); + if (error_code) { + CALL_ENG_DEBUG(ENG_ERR, "mm_sound_route_add_change_callback failed. error_code:[0x%x]\n", error_code); + return; + } + + papp_snd->bsound_cm_state = TRUE; + } + return; +} + +/** +* This function unregisters the application from the sound conflict manager +* +* @return void +* @param[in] papp_snd Handle to Sound Manager +*/ +void voicecall_snd_unregister_cm(voicecall_snd_mgr_t *papp_snd) +{ + int error_code = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, "current bsound_cm_state:[%d]. \n", papp_snd->bsound_cm_state); + + if (TRUE == papp_snd->bsound_cm_state) { + /*Reset the Path when the app is closed - safety code */ + voicecall_snd_change_mm_path(papp_snd, VOICE_CALL_MM_RESET); + CALL_ENG_DEBUG(ENG_DEBUG, "Sound Path reset to Default\n"); + + papp_snd->bsound_cm_state = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, "Unregistering Sound CM\n"); + error_code = mm_session_finish(); + if (error_code) { + CALL_ENG_DEBUG(ENG_ERR, "mm_session_finish failed. error_code:[0x%x]\n", error_code); + } + error_code = mm_sound_route_remove_change_callback(); + if (error_code) { + CALL_ENG_DEBUG(ENG_ERR, "mm_sound_route_remove_change_callback failed. error_code:[0x%x]\n", error_code); + } + error_code = mm_sound_route_set_system_policy(papp_snd->backup_route_policy); + if (error_code) { + CALL_ENG_DEBUG(ENG_ERR, "mm_sound_route_set_system_policy failed. error_code:[0x%x]\n", error_code); + } + } + /*Set to Defaults */ + voicecall_snd_set_to_defaults(papp_snd); + return; +} + +gboolean __voicecall_snd_effect_idle_cb(gpointer puser_data) +{ + voicecall_snd_mgr_t *papp_snd = (voicecall_snd_mgr_t *)puser_data; + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + papp_snd->effect_tone_status = VOICE_CALL_SND_STATUS_NONE; + CALL_ENG_DEBUG(ENG_DEBUG, "papp_snd->effect_tone_status = %d\n", papp_snd->effect_tone_status); + + /*If connected call exists then change the audio path */ + if ((TRUE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) || (TRUE == voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine))) { + CALL_ENG_DEBUG(ENG_DEBUG, "Connected call exists, changing path at the end of effect tone \n"); + + CALL_ENG_DEBUG(ENG_ERR, "papp_snd->signal_sound_status = %d \n", papp_snd->signal_sound_status); + /*Check the signal play status, if signal is being prepared / played, don't change the path */ + if (VOICE_CALL_SND_STATUS_NONE == papp_snd->signal_sound_status) { + voicecall_snd_change_path(papp_snd); + } else { + CALL_ENG_DEBUG(ENG_ERR, "Signal is playing, skipping path change, it will be done at the end of signal \n"); + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "non connected call\n"); + } + CALL_ENG_DEBUG(ENG_DEBUG, "Over\n"); + return FALSE; +} + +static void __voicecall_snd_effect_cb(gpointer puser_data) +{ + voicecall_snd_mgr_t *papp_snd = (voicecall_snd_mgr_t *)puser_data; + + CALL_ENG_DEBUG(ENG_DEBUG, "effect_tone_status = %d, Calling Idle\n", papp_snd->effect_tone_status); + papp_snd->effect_tone_status = VOICE_CALL_SND_STATUS_STOPPED; + + __voicecall_snd_effect_idle_cb(papp_snd); + CALL_ENG_DEBUG(ENG_DEBUG, "End : papp_snd->effect_tone_status = %d\n", papp_snd->effect_tone_status); +} + +gboolean voicecall_snd_play_effect_tone(voicecall_snd_mgr_t *papp_snd, int effect_type) +{ + int error_code = -1; + gboolean bzuhause = FALSE; + gboolean bstatus = FALSE; + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + CALL_ENG_DEBUG(ENG_DEBUG, "effect type:[%d] \n", effect_type); + + switch (effect_type) { + case VOICE_CALL_SND_EFFECT_CALL_CONNECT: + { + CALL_ENG_KPI("voicecall_core_get_zuhause start"); + voicecall_core_get_zuhause(pcall_core->pcall_engine, &bzuhause); + CALL_ENG_KPI("voicecall_core_get_zuhause done"); + + if (bzuhause == TRUE) { + CALL_ENG_DEBUG(ENG_DEBUG, "It's zuhause area! don't play connect tone!\n"); + return FALSE; + } + + CALL_ENG_KPI("get VCONFKEY_CISSAPPL_CALL_CONNECT_TONE_BOOL start"); + if (vconf_get_bool(VCONFKEY_CISSAPPL_CALL_CONNECT_TONE_BOOL, &bstatus)) { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_bool failed.\n"); + } + CALL_ENG_KPI("get VCONFKEY_CISSAPPL_CALL_CONNECT_TONE_BOOL done"); + + if (!bstatus) { + CALL_ENG_DEBUG(ENG_DEBUG, "Connect Tone Settings not enabled \n"); + return FALSE; + } + + /*First Reset the audio Path to PDA */ + voicecall_snd_change_mm_path(papp_snd, VOICE_CALL_MM_ALERT_TONE); + + error_code = mm_sound_play_sound(VOICE_CALL_SND_CONNECT_SIGNAL_PATH, VOLUME_TYPE_CALL, __voicecall_snd_effect_cb, papp_snd, &papp_snd->mmfsoundplay_handle); + } + break; + case VOICE_CALL_SND_EFFECT_CALL_DISCONNECT: + { + + if (vconf_get_bool(VCONFKEY_CISSAPPL_CALL_END_TONE_BOOL, &bstatus)) { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_bool failed.\n"); + } + + if (!bstatus) { + CALL_ENG_DEBUG(ENG_DEBUG, "Disconnect Tone Settings not enabled \n"); + return FALSE; + } + + voicecall_snd_change_mm_path(papp_snd, VOICE_CALL_MM_ALERT_TONE); + + error_code = mm_sound_play_sound(VOICE_CALL_SND_DISCONNECT_SIGNAL_PATH, VOLUME_TYPE_CALL, __voicecall_snd_effect_cb, papp_snd, &papp_snd->mmfsoundplay_handle); + + } + break; + + case VOICE_CALL_SND_EFFECT_CALL_MINUTE_MINDER: + { + voicecall_snd_change_mm_path(papp_snd, VOICE_CALL_MM_ALERT_TONE); + error_code = mm_sound_play_sound(VOICE_CALL_SND_MINUTE_MINDER_SIGNAL_PATH, VOLUME_TYPE_CALL, __voicecall_snd_effect_cb, papp_snd, &papp_snd->mmfsoundplay_handle); + } + break; + + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Invalid Effect Type: %d \n", effect_type); + + } + + if (MM_ERROR_NONE == error_code) { + papp_snd->effect_tone_status = VOICE_CALL_SND_STATUS_PLAY; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "error code = [0x%x] \n", error_code); + return (MM_ERROR_NONE == error_code) ? TRUE : FALSE; +} + +gboolean voicecall_snd_is_effect_playing(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_ERR, "Effect tone status: %d\n", papp_snd->effect_tone_status); + if (VOICE_CALL_SND_STATUS_PLAY == papp_snd->effect_tone_status) { + return TRUE; + } + + return FALSE; +} + +void voicecall_snd_stop_effect_tone(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_ERR, "Effect tone status: %d\n", papp_snd->effect_tone_status); + + if (VOICE_CALL_SND_STATUS_PLAY == papp_snd->effect_tone_status) { + if (MM_ERROR_NONE != mm_sound_stop_sound(papp_snd->mmfsoundplay_handle)) { + CALL_ENG_DEBUG(ENG_ERR, "MM Stop Sound Failed \n"); + } + + papp_snd->effect_tone_status = VOICE_CALL_SND_STATUS_NONE; + papp_snd->mmfsoundplay_handle = VOICE_CALL_SND_INVALID_SND_HANDLE; + } + CALL_ENG_DEBUG(ENG_ERR, "Effect tone status: %d\n", papp_snd->effect_tone_status); +} + +void voicecall_snd_set_to_defaults(voicecall_snd_mgr_t *papp_snd) +{ + call_vc_core_state_t *pcall_core = NULL; + + CALL_ENG_DEBUG(ENG_DEBUG, "papp_snd = %p \n", papp_snd); + + /*Backup core handle */ + pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + /*Reset Sound Magr Data */ + memset(papp_snd, 0, sizeof(voicecall_snd_mgr_t)); + + /*Re Assign core handle */ + papp_snd->pcall_core = pcall_core; + + /*Set to Defaults */ + papp_snd->pmm_player = VOICE_CALL_SND_INVALID_PLAYER_HANDLE; + papp_snd->pmm_signal_player = VOICE_CALL_SND_INVALID_SND_HANDLE; + + papp_snd->mmfsoundplay_handle = VOICE_CALL_SND_INVALID_SND_HANDLE; + papp_snd->mmfalternateplay_handle = VOICE_CALL_SND_INVALID_SND_HANDLE; + +} diff --git a/debian/README b/debian/README new file mode 100755 index 0000000..1aea91c --- /dev/null +++ b/debian/README @@ -0,0 +1,6 @@ +The Debian Package call +---------------------------- + +Comments regarding the Package + + -- unknown Tue, 17 Nov 2009 09:51:48 +0900 diff --git a/debian/changelog b/debian/changelog new file mode 100755 index 0000000..423071f --- /dev/null +++ b/debian/changelog @@ -0,0 +1,9 @@ +call (0.2.333) unstable; urgency=low + + * 1. Apply EFL migration change + 2. Update bilerplate + 3. Support appsvc mo call + * Git: pkgs/c/call + * Tag: call_0.2.333 + + -- Jungmin Kim Fri, 17 Feb 2012 21:14:16 +0900 diff --git a/debian/compat b/debian/compat new file mode 100755 index 0000000..7ed6ff8 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +5 diff --git a/debian/control b/debian/control new file mode 100755 index 0000000..229a680 --- /dev/null +++ b/debian/control @@ -0,0 +1,42 @@ +Source: call +Section: comm +Priority: extra +Maintainer: Sung Joon Won , SHUAIB SHUKUR , Goo Lee +Uploaders: Sung Joon Won , SHUAIB SHUKUR , JongSeok Lee , Yountaek Oh , Goo Lee +Build-Depends: debhelper (>= 5), + autotools-dev, + libappcore-efl-dev, + libelm-dev, + libslp-tapi-dev, + libslp-setting-dev, + libcontacts-service-dev, + libui-gadget-dev, + libslp-utilx-dev, + libmm-sound-dev, + libmm-player-dev, + libslp-pm-dev, + libaul-1-dev, + libdevman-haptic-dev, + libmm-camcorder-dev, + libmm-session-dev, + dlog-dev, + libslp-sensor-0, + libslp-sysman, + libslp-msg-service-dev, + libicu-dev, + libappsvc-dev, + libnotification-dev, + libug-contacts-dev (>= 0.1.0-31), +Standards-Version: 3.7.2 + +Package: org.tizen.call +Section: comm +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: call application + +Package: org.tizen.call-dbg +Section: comm +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: call application (unstripped) diff --git a/debian/copyright b/debian/copyright new file mode 100755 index 0000000..e69de29 diff --git a/debian/dirs b/debian/dirs new file mode 100755 index 0000000..ca882bb --- /dev/null +++ b/debian/dirs @@ -0,0 +1,2 @@ +usr/bin +usr/sbin diff --git a/debian/docs b/debian/docs new file mode 100755 index 0000000..7a77580 --- /dev/null +++ b/debian/docs @@ -0,0 +1,2 @@ +CMakeCache.txt +CMakeLists.txt diff --git a/debian/org.tizen.call.install.in b/debian/org.tizen.call.install.in new file mode 100755 index 0000000..d693a62 --- /dev/null +++ b/debian/org.tizen.call.install.in @@ -0,0 +1,4 @@ +@PREFIX@/bin/* +@PREFIX@/res/* +@PREFIX@/data +/opt/share/applications/* diff --git a/debian/org.tizen.call.postinst b/debian/org.tizen.call.postinst new file mode 100755 index 0000000..8c2fa75 --- /dev/null +++ b/debian/org.tizen.call.postinst @@ -0,0 +1,12 @@ +#!/bin/sh +if [ ${USER} == "root" ] +then + # 5000 is inhouse user id + # do not use relative path + chown -R 5000:5000 /opt/apps/org.tizen.call/data + /usr/bin/vconftool set -t int "memory/call/state" "0" -g 6521 -i + /usr/bin/vconftool set -t int "db/call/vol_level" "4" -g 6521 +else + /usr/bin/vconftool set -t int "memory/call/state" "0" -i +fi + diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..2de8e30 --- /dev/null +++ b/debian/rules @@ -0,0 +1,154 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +CFLAGS ?= -Wall -g +CXXFLAGS ?= -Wall -g +LDFLAGS ?= +PREFIX ?= /opt/apps/org.tizen.call +RESDIR ?= ${PREFIX}/res +DATADIR ?= ${PREFIX}/data + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 + CXXFLAGS += -O0 +else + CFLAGS += -O2 + CXXFLAGS += -O2 +endif + +CFLAGS += -fPIC +CXXFLAGS += -fPIC + +LDFLAGS += -Wl,--rpath=$(/PREFIX)/lib -Wl,--hash-style=both -Wl,--as-needed + +CMAKE_TMP_DIR = $(CURDIR)/cmake_tmp + + +configure: configure-stamp +configure-stamp: + dh_testdir + # Add here commands to configure the package. + mkdir -p $(CMAKE_TMP_DIR); + cd $(CMAKE_TMP_DIR); CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" LDFLAGS="$(LDFLAGS)" cmake .. -DCMAKE_INSTALL_PREFIX=$(PREFIX) + + touch configure-stamp + +build: build-stamp + +build-stamp: configure-stamp + dh_testdir + + # Add here commands to compile the package. + cd $(CMAKE_TMP_DIR) && $(MAKE) + #docbook-to-man debian/wavplayer.sgml > wavplayer.1 + + for f in `find $(CURDIR)/debian/ -name "*.in"`; do \ + cat $$f > $${f%.in}; \ + sed -i -e "s#@PREFIX@#$(PREFIX)#g" $${f%.in}; \ + sed -i -e "s#@PREFIX@#$(RESDIR)#g" $${f%.in}; \ + sed -i -e "s#@DATADIR@#$(DATADIR)#g" $${f%.in}; \ + done + + + touch $@ + +clean: + dh_testdir + dh_testroot + rm -f build-stamp configure-stamp + + # Add here commands to clean up after the build process. + -cd $(CMAKE_TMP_DIR) && $(MAKE) clean + rm -rf $(CMAKE_TMP_DIR) + + rm -rf CMakeCache.txt + rm -rf CMakeFiles + rm -rf cmake_install.cmake + rm -rf Makefile + rm -rf install_manifest.txt + + rm -rf daemon/CMakeFiles + rm -rf daemon/cmake_install.cmake + rm -rf daemon/Makefile + rm -rf daemon/install_manifest.txt + + rm -rf ui/CMakeFiles + rm -rf ui/cmake_install.cmake + rm -rf ui/Makefile + rm -rf ui/install_manifest.txt + + rm -rf ui/*.edj + rm -rf ui/themes/*.edj + + rm -rf ui/po/CMakeFiles + rm -rf ui/po/cmake_install.cmake + rm -rf ui/po/Makefile + + rm -rf ui/org.tizen.call.desktop + + rm -rf cmake_tmp + + + + for f in `find $(CURDIR)/debian/ -name "*.in"`; do \ + rm -f $${f%.in}; \ + done + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/wavplayer. + cd $(CMAKE_TMP_DIR) && $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install + + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot +# dh_installchangelogs +# dh_installdocs +# dh_installexamples + dh_install --sourcedir=debian/tmp +# dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_python +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link +# dh_strip + dh_strip --dbg-package=org.tizen.call-dbg + dh_compress + dh_fixperms +# dh_perl + dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/packaging/org.tizen.call.spec b/packaging/org.tizen.call.spec new file mode 100644 index 0000000..030f352 --- /dev/null +++ b/packaging/org.tizen.call.spec @@ -0,0 +1,66 @@ +Name: org.tizen.call +Summary: call application +Version: 0.2.333 +Release: 1 +Group: Applications +License: Flora Software License +Source0: %{name}-%{version}.tar.gz +BuildRequires: pkgconfig(appcore-efl) +BuildRequires: pkgconfig(elementary) +BuildRequires: pkgconfig(vconf) +BuildRequires: pkgconfig(utilX) +BuildRequires: pkgconfig(alsa) +BuildRequires: pkgconfig(pmapi) +BuildRequires: pkgconfig(sensor) +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(aul) +BuildRequires: pkgconfig(contacts-service) +BuildRequires: pkgconfig(ui-gadget) +BuildRequires: pkgconfig(tapi) +BuildRequires: pkgconfig(mm-sound) +BuildRequires: pkgconfig(mm-camcorder) +BuildRequires: pkgconfig(mm-session) +BuildRequires: pkgconfig(mm-player) +BuildRequires: pkgconfig(devman_haptic) +BuildRequires: pkgconfig(msg-service) +BuildRequires: pkgconfig(ecore-x) +BuildRequires: pkgconfig(ecore-input) +BuildRequires: pkgconfig(icu-i18n) +BuildRequires: pkgconfig(appsvc) +BuildRequires: pkgconfig(notification) +BuildRequires: libug-contacts-devel +BuildRequires: cmake +BuildRequires: gettext-tools +BuildRequires: edje-tools +Requires(post): /usr/bin/vconftool + + +%description +call application. + +%prep +%setup -q + +%build + +%define PREFIX "/opt/apps/org.tizen.call" +cmake . -DCMAKE_INSTALL_PREFIX=%{PREFIX} + +make %{?jobs:-j%jobs} + + +%install +rm -rf %{buildroot} +%make_install + +%post +/usr/bin/vconftool set -t int "memory/call/state" "0" -g 6521 -i +/usr/bin/vconftool set -t int "db/call/vol_level" "4" -g 6521 +chown -R 5000:5000 /opt/apps/org.tizen.call/data + +%files +/opt/apps/org.tizen.call/bin/* +/opt/apps/org.tizen.call/res/* +/opt/share/applications/org.tizen.call.desktop +%dir /opt/apps/org.tizen.call/data + diff --git a/ui/CMakeLists.txt b/ui/CMakeLists.txt new file mode 100755 index 0000000..9c7d4bc --- /dev/null +++ b/ui/CMakeLists.txt @@ -0,0 +1,167 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) + +SET(UI_SRCS + ../call-engine/core/vc-core-engine.c + ../call-engine/core/vc-core-callmanager.c + ../call-engine/core/vc-core-engine-status.c + ../call-engine/core/vc-core-tapi-evnt.c + ../call-engine/core/vc-core-util.c + ../call-engine/core/vc-core-callagent.c + ../call-engine/core/vc-core-ccbs.c + ../call-engine/core/vc-core-engine-group.c + ../call-engine/core/vc-core-svcall.c + ../call-engine/core/vc-core-tapi-rqst.c + ../call-engine/voice-call-core.c + ../call-engine/voice-call-sound.c + ../call-engine/voice-call-service.c + ../call-engine/voice-call-device.c + ../call-engine/voice-call-bt.c + ../call-engine/voice-call-engine.c + ../call-engine/voice-call-dbus.c + vcui-application.c + vcui-app-window.c + vcui-view-choice.c + vcui-engine-interface.c + vcui-document.c + vcui-view-dialing.c + vcui-view-incoming.c + vcui-view-incoming-lock.c + vcui-view-keypad.c + vcui-view-elements.c + vcui-view-common.c + vcui-view-single-call.c + vcui-view-multi-call-split.c + vcui-view-multi-call-conf.c + vcui-view-multi-call-list.c + vcui-view-popup.c + vcui-doc-launch.c + vcui-view-callend.c + ) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR} ../call-engine/include ../call-engine/core/include) + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(BINDIR "${PREFIX}/bin") +SET(RESDIR "${PREFIX}/res") +SET(DATADIR "${PREFIX}/data") +SET(LOCALEDIR "${RESDIR}/locale") +SET(ICONDIR "${RESDIR}/icons/default/small") +SET(EDJDIR "${RESDIR}/edje") +SET(IMGDIR "${RESDIR}/images") +SET(MEDIADIR "${RESDIR}/media") + +IF("${CMAKE_BUILD_TYPE}" STREQUAL "") + SET(CMAKE_BUILD_TYPE "Release") +ENDIF("${CMAKE_BUILD_TYPE}" STREQUAL "") +MESSAGE("Build type: ${CMAKE_BUILD_TYPE}") + + +# for LOG +ADD_DEFINITIONS("-DCALL_DEBUG_ON_DLOG") + +# for Engine +ADD_DEFINITIONS("-DSWAP_SUPPORT") +ADD_DEFINITIONS("-DCALL_VC_SEND_SAT_RESPONSE_ORIG") +ADD_DEFINITIONS("-DRELEASE_ALL_AND_ACCEPT_SUPPORT") +ADD_DEFINITIONS("-DVC_ENG_FDN_SUPPORT") + +# for debuging +#ADD_DEFINITIONS("-DTIMER_ENABLED") +#ADD_DEFINITIONS("-DVOICECALL_KPI") +#ADD_DEFINITIONS("-DCALLDETAILS_DUMP") + +#for UI +ADD_DEFINITIONS("-DEND_KEY_PROCESSING") +ADD_DEFINITIONS("-DPDIAL_SEND_DTMF") +#ADD_DEFINITIONS("-DBG") +ADD_DEFINITIONS("-D_NEW_SND_") +ADD_DEFINITIONS("-DSIGNAL_HANDLER") + +INCLUDE(FindPkgConfig) +pkg_check_modules(ui_pkgs REQUIRED + appcore-efl + vconf + utilX + alsa + pmapi + sensor + dlog + aul + contacts-service + ui-gadget + tapi + contacts-service + mm-sound + mm-camcorder + mm-player + mm-session + pmapi + devman_haptic + msg-service + ecore + ecore-x + ecore-input + edje + eina + evas + elementary + icu-i18n + appsvc + notification +) + + +SET(EXTRA_CFLAGS "") +FOREACH(flag ${ui_pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_C_FLAGS "${COMMON_C_FLAGS} -fpie ${EXTRA_CFLAGS}") + +ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") +ADD_DEFINITIONS("-DRESDIR=\"${RESDIR}\"") +ADD_DEFINITIONS("-DDATADIR=\"${DATADIR}\"") +ADD_DEFINITIONS("-DLOCALEDIR=\"${LOCALEDIR}\"") +ADD_DEFINITIONS("-DICONDIR=\"${ICONDIR}\"") +ADD_DEFINITIONS("-DEDJDIR=\"${EDJDIR}\"") +ADD_DEFINITIONS("-DIMGDIR=\"${IMGDIR}\"") +ADD_DEFINITIONS("-DMEDIADIR=\"${MEDIADIR}\"") + +ADD_EXECUTABLE(voice-call-ui ${UI_SRCS}) +TARGET_LINK_LIBRARIES(voice-call-ui "-pie" ${ui_pkgs_LDFLAGS}) +message(${ui_pkgs_LDFLAGS}) + +ADD_CUSTOM_TARGET(voice-call-ui.edj + COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/images ${SHARED_FLAGS} + ${CMAKE_CURRENT_SOURCE_DIR}/call_edc/voice-call-ui.edc ${CMAKE_CURRENT_SOURCE_DIR}/voice-call-ui.edj + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/call_edc/voice-call-ui.edc +) +ADD_DEPENDENCIES(voice-call-ui voice-call-ui.edj) + +ADD_CUSTOM_TARGET(call_theme.edj + COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/themes + ${CMAKE_CURRENT_SOURCE_DIR}/themes/call_theme.edc ${CMAKE_CURRENT_SOURCE_DIR}/themes/call_theme.edj + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/themes/call_theme.edc +) +ADD_DEPENDENCIES(voice-call-ui voice-call-ui.edj call_theme.edj) + +#install binary & edj files +INSTALL(TARGETS voice-call-ui DESTINATION ${BINDIR}) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/voice-call-ui.edj DESTINATION ${EDJDIR}) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/themes/call_theme.edj DESTINATION ${EDJDIR}) + +# install ini file ( not used) +#INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/voice-call-ui.ini DESTINATION share/process-info) + +# install desktop file & icon +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/org.tizen.call.desktop.in ${CMAKE_CURRENT_SOURCE_DIR}/org.tizen.call.desktop) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/org.tizen.call.desktop DESTINATION /opt/share/applications) +INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/images/hd/icon/ DESTINATION ${IMGDIR} FILES_MATCHING PATTERN "*.png") +INSTALL(DIRECTORY ../call-engine/sounds/ DESTINATION ${MEDIADIR} FILES_MATCHING PATTERN "*.wav") + +# install application HOME directory +INSTALL(DIRECTORY DESTINATION ${DATADIR}) + +# i18n +ADD_SUBDIRECTORY(po) diff --git a/ui/call_edc/vcui-view-dialing.edc b/ui/call_edc/vcui-view-dialing.edc new file mode 100755 index 0000000..ff23891 --- /dev/null +++ b/ui/call_edc/vcui-view-dialing.edc @@ -0,0 +1,129 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +group{ + name: "mo-view"; + parts{ + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_DEFAULT; + } + } + + part { name: "swl_cid_background"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: DIALLING_BACKGROUND_CID_L DIALLING_BACKGROUND_CID_T; to: "background";} + rel2 { relative: DIALLING_BACKGROUND_CID_R DIALLING_BACKGROUND_CID_B; to: "background";} + } + } + + part { name: "bg_alpha"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_BG_ALPHA; + } + } + + part { name: "swl_cid"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: DIALLING_CID_L DIALLING_CID_T; } + rel2 { relative: DIALLING_CID_R DIALLING_CID_B; } + } + } + + part { name: "txt_mo_status"; // dialling or connecting text + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: DIALLING_STATUS_L DIALLING_STATUS_T;to: "background";} + rel2 { relative: DIALLING_STATUS_R DIALLING_STATUS_B;to: "background"; } + text { font, FONT_SLP_Roman; size, 48; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + } + + + part { name: "txt_call_name"; // call name or number + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: DIALLING_NAME_L DIALLING_NAME_T;to: "background";} + rel2 { relative: DIALLING_NAME_R DIALLING_NAME_B;to: "background"; } + text { font, FONT_SLP_Roman; size, 76; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + } + + part { name: "txt_contact_phone_type"; // contact phone type -> call number + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: DIALLING_NUMBER_L DIALLING_NUMBER_T; to: "background"; } + rel2 { relative: DIALLING_NUMBER_R DIALLING_NUMBER_B;to: "background"; } + text { font, FONT_SLP_Roman; size, 48; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + } + + part { name: "btn_speaker"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: SIX_BTN_1_L SIX_BTN_2_T; to: "background";} + rel2 { relative: SIX_BTN_1_R SIX_BTN_2_B; to: "background";} + } + } + + part { name: "btn_bigend"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: SIX_BTN_BIG_END_L SIX_BTN_BIG_END_T; to: "background";} + rel2 { relative: SIX_BTN_BIG_END_R SIX_BTN_BIG_END_B; to: "background";} + } + } + } + + programs{ + program { name: "init"; + signal: "INIT"; + source: "PROG"; + action: STATE_SET "default" 0.0; + target: "background"; + target: "swl_cid"; + target: "swl_cid_background"; + } + } +} \ No newline at end of file diff --git a/ui/call_edc/vcui-view-end-conf-call.edc b/ui/call_edc/vcui-view-end-conf-call.edc new file mode 100755 index 0000000..f6a1c7a --- /dev/null +++ b/ui/call_edc/vcui-view-end-conf-call.edc @@ -0,0 +1,163 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +group { + name: "end-confcall"; + parts { + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_DEFAULT; + } + } + part { name: "swl_cid_background"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: INCALL_BACKGROUND_CID_L INCALL_BACKGROUND_CID_T; to: "background";} + rel2 { relative: INCALL_BACKGROUND_CID_R INCALL_BACKGROUND_CID_B; to: "background";} + } + } + + part { name: "bg_alpha"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_BG_ALPHA; + } + } + + part { name: "swl_cid"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: INCALL_CID_L INCALL_CID_T; } + rel2 { relative: INCALL_CID_R INCALL_CID_B; } + } + } + + part { name: "swl_cid_dim"; /*for held call dim*/ + type: RECT; + scale: 1; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + visible: 0; + color: COLOR_BG_FOR_HELD_CALL_DIM; + } + description { + state: "wvga" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: 0.0 0.0; offset: 6 0; to: "swl_cid";} + rel2 { relative: 1.0 1.0; offset: -6 0; to: "swl_cid";} + } + description { + state: "hd" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: 0.0 0.0; to: "swl_cid";} + rel2 { relative: 1.0 1.0; to: "swl_cid";} + } + } + + part { name: "txt_call_name"; /*call name or number*/ + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: INCALL_NAME_L INCALL_NAME_T; } + rel2 { relative: INCALL_NAME_R INCALL_NAME_B; } + text { font, FONT_SLP_Roman; size, 76; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + } + + part { name: "txt_contact_phone_type"; /*in case of multicallconf, it is num of people*/ + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: INCALL_NUMBER_L INCALL_NUMBER_T; } + rel2 { relative: INCALL_NUMBER_R INCALL_NUMBER_B; } + text { font, FONT_SLP_Roman; size, 48; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + } + + part { name: "txt_timer"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: INCALL_TIMER_L INCALL_TIMER_T; } + rel2 { relative: INCALL_TIMER_R INCALL_TIMER_B; } + text { font, FONT_SLP_Roman; size, 48; align, 1.0 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + } + + part { name: "btn_bigend"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: SIX_BTN_BIG_END_L SIX_BTN_BIG_END_T; to: "background";} + rel2 { relative: SIX_BTN_BIG_END_R SIX_BTN_BIG_END_B; to: "background";} + } + } + + part { name: "btn_speaker"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: SIX_BTN_1_L SIX_BTN_2_T; to: "background";} + rel2 { relative: SIX_BTN_1_R SIX_BTN_2_B; to: "background";} + } + } + } + + programs { + program { name: "hide_dim_cid"; + signal: "HIDE_DIM"; + source: "CID"; + action: STATE_SET "default" 0.0; + target: "swl_cid_dim"; + } + program { name: "show_dim_cid_wvga"; + signal: "SHOW_DIM_WVGA"; + source: "CID_WVGA"; + action: STATE_SET "wvga" 0.0; + target: "swl_cid_dim"; + } + program { name: "show_dim_cid_hd"; + signal: "SHOW_DIM_HD"; + source: "CID_HD"; + action: STATE_SET "hd" 0.0; + target: "swl_cid_dim"; + } + } +} \ No newline at end of file diff --git a/ui/call_edc/vcui-view-end-single-call.edc b/ui/call_edc/vcui-view-end-single-call.edc new file mode 100755 index 0000000..e3475ed --- /dev/null +++ b/ui/call_edc/vcui-view-end-single-call.edc @@ -0,0 +1,98 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: "end-singlecall"; + + parts { + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_DEFAULT; + } + } + + part { name: "swl_cid_background"; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 1; + rel1 { relative: ENDSINGLECALL_BACKGROUND_CID_L ENDSINGLECALL_BACKGROUND_CID_T; to: "background";} + rel2 { relative: ENDSINGLECALL_BACKGROUND_CID_R ENDSINGLECALL_BACKGROUND_CID_B; to: "background";} + } + } + + part { name: "bg_alpha"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_BG_ALPHA; + } + } + + part { name: "swl_cid"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: ENDSINGLECALL_CID_L ENDSINGLECALL_CID_T; } + rel2 { relative: ENDSINGLECALL_CID_R ENDSINGLECALL_CID_B; } + } + } + + part { name: "txt_call_name"; // call name or number + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: ENDSINGLECALL_NAME_L ENDSINGLECALL_NAME_T; } + rel2 { relative: ENDSINGLECALL_NAME_R ENDSINGLECALL_NAME_B; } + text { font, FONT_SLP_Roman; size, 76; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + } + + part { name: "txt_contact_phone_type"; // contact phone type -> call number + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: ENDSINGLECALL_NUMBER_L ENDSINGLECALL_NUMBER_T; } + rel2 { relative: ENDSINGLECALL_NUMBER_R ENDSINGLECALL_NUMBER_B; } + text { font, FONT_SLP_Roman; size, 48; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + } + + part { name: "txt_timer"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: ENDSINGLECALL_TIMER_L ENDSINGLECALL_TIMER_T; } + rel2 { relative: ENDSINGLECALL_TIMER_R ENDSINGLECALL_TIMER_B; } + text { font, FONT_SLP_Roman; size, 44; align, 1.0 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + } + } + } \ No newline at end of file diff --git a/ui/call_edc/vcui-view-incoming-lock.edc b/ui/call_edc/vcui-view-incoming-lock.edc new file mode 100755 index 0000000..2911a01 --- /dev/null +++ b/ui/call_edc/vcui-view-incoming-lock.edc @@ -0,0 +1,316 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +group { + name: "lock_accept"; + + parts { + part { + name: "accept_bg"; + type: IMAGE; + mouse_events:1; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: INCOMING_LOCK_ACCEPT_BG_L INCOMING_LOCK_ACCEPT_BG_T; } + rel2 { relative: INCOMING_LOCK_ACCEPT_BG_R INCOMING_LOCK_ACCEPT_BG_B; } + image { + normal: IMG_SRC_DIR/"vc_lock_left_bg.png"; + } + align: 0.0 0.5; + color: 255 255 255 255; + visible: 1; + } + description { + state: "alpha" 0.0; + inherit: "default" 0.0; + color: 255 255 255 76; // 30% + visible: 1; + } + } + + part { + name: "accept_icon"; + type: IMAGE; + mouse_events:1; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: INCOMING_LOCK_ACCEPT_ICON_L INCOMING_LOCK_ACCEPT_ICON_T; to: "accept_bg"; } + rel2 { relative: INCOMING_LOCK_ACCEPT_ICON_R INCOMING_LOCK_ACCEPT_ICON_B; to: "accept_bg"; } + image { + normal: IMG_SRC_DIR/"vc_lock_accept_icon.png"; + } + align: 0.5 0.5; + color: 255 255 255 255; + visible: 1; + } + description { + state: "alpha" 0.0; + inherit: "default" 0.0; + color: 255 255 255 76; // 30% + visible: 1; + } + } + + part { + name: "accept_text"; + type: TEXT; + mouse_events:0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: INCOMING_LOCK_ACCEPT_TEXT_L INCOMING_LOCK_ACCEPT_TEXT_T; to: "accept_bg"; } + rel2 { relative: INCOMING_LOCK_ACCEPT_TEXT_R INCOMING_LOCK_ACCEPT_TEXT_B; to: "accept_bg"; } + text { font, FONT_SLP_Roman; size, 58; align, 0.5 0.5; } + color: 255 255 255 255; + visible: 1; + } + description { + state: "alpha" 0.0; + inherit: "default" 0.0; + color: 255 255 255 76; // 30% + visible: 1; + } + } + } + + programs { + program { + name: "lock_accept,default"; + signal: "lock_accept,default"; + source: "prog"; + action: STATE_SET "default" 0.0; + target: "accept_bg"; + target: "accept_icon"; + target: "accept_text"; + transition: LINEAR 0.3; + } + program { + name: "lock_accept,alpha"; + signal: "lock_accept,alpha"; + source: "prog"; + action: STATE_SET "alpha" 0.0; + target: "accept_bg"; + target: "accept_icon"; + target: "accept_text"; + transition: LINEAR 0.3; + } + } +} + +group { + name: "lock_reject"; + + parts { + part { + name: "reject_bg"; + type: IMAGE; + mouse_events:1; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: INCOMING_LOCK_REJECT_BG_L INCOMING_LOCK_REJECT_BG_T; } + rel2 { relative: INCOMING_LOCK_REJECT_BG_R INCOMING_LOCK_REJECT_BG_B; } + image { + normal: IMG_SRC_DIR/"vc_lock_right_bg.png"; + } + align: 0.0 0.5; + color: 255 255 255 255; + visible: 1; + } + description { + state: "alpha" 0.0; + inherit: "default" 0.0; + color: 255 255 255 76; // 30% + visible: 1; + } + } + + part { + name: "reject_icon"; + type: IMAGE; + mouse_events:1; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: INCOMING_LOCK_REJECT_ICON_L INCOMING_LOCK_REJECT_ICON_T; to: "reject_bg"; } + rel2 { relative: INCOMING_LOCK_REJECT_ICON_R INCOMING_LOCK_REJECT_ICON_B; to: "reject_bg"; } + image { + normal: IMG_SRC_DIR/"vc_lock_reject_icon.png"; + } + align: 0.5 0.5; + color: 255 255 255 255; + visible: 1; + } + description { + state: "alpha" 0.0; + inherit: "default" 0.0; + color: 255 255 255 76; // 30% + visible: 1; + } + } + + part { + name: "reject_text"; + type: TEXT; + mouse_events:0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: INCOMING_LOCK_REJECT_TEXT_L INCOMING_LOCK_REJECT_TEXT_T; to: "reject_bg"; } + rel2 { relative: INCOMING_LOCK_REJECT_TEXT_R INCOMING_LOCK_REJECT_TEXT_B; to: "reject_bg"; } + text { font, FONT_SLP_Roman; size, 58; align, 0.5 0.5; } + color: 255 255 255 255; + visible: 1; + } + description { + state: "alpha" 0.0; + inherit: "default" 0.0; + color: 255 255 255 76; // 30% + visible: 1; + } + } + } + + programs { + program { + name: "lock_reject,default"; + signal: "lock_reject,default"; + source: "prog"; + action: STATE_SET "default" 0.0; + target: "reject_bg"; + target: "reject_icon"; + target: "reject_text"; + transition: LINEAR 0.3; + } + program { + name: "lock_reject,alpha"; + signal: "lock_reject,alpha"; + source: "prog"; + action: STATE_SET "alpha" 0.0; + target: "reject_bg"; + target: "reject_icon"; + target: "reject_text"; + transition: LINEAR 0.3; + } + } +} + +group { + name: "mtlock"; + parts { + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_DEFAULT; + } + } + + part { name: "swl_cid_background"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: DIALLING_BACKGROUND_CID_L DIALLING_BACKGROUND_CID_T; to: "background";} + rel2 { relative: DIALLING_BACKGROUND_CID_R DIALLING_BACKGROUND_CID_B; to: "background";} + } + } + + part { name: "bg_alpha"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_BG_ALPHA; + } + } + + part { name: "swl_calling_name_bg"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: MT_CALLING_BG_L MT_CALLING_BG_T; to: "background";} + rel2 { relative: MT_CALLING_BG_R MT_CALLING_BG_B; to: "background";} + } + } + + part { name: "swl_cid"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: DIALLING_CID_L DIALLING_CID_T; } + rel2 { relative: DIALLING_CID_R DIALLING_CID_B; } + } + } + + part { name: "txt_call_name"; // call name or number + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: DIALLING_NAME_L DIALLING_NAME_T;to: "background";} + rel2 { relative: DIALLING_NAME_R DIALLING_NAME_B;to: "background"; } + text { font, FONT_SLP_Roman; size, 76; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + } + + part { name: "txt_contact_phone_type"; // contact phone type -> call number + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: DIALLING_NUMBER_L DIALLING_NUMBER_T; to: "background"; } + rel2 { relative: DIALLING_NUMBER_R DIALLING_NUMBER_B;to: "background"; } + text { font, FONT_SLP_Roman; size, 48; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + } + + /* + part { name: "txt_mt_status"; // Voice call + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: DIALLING_MT_STATUS_L DIALLING_MT_STATUS_T;to: "background";} + rel2 { relative: DIALLING_MT_STATUS_R DIALLING_MT_STATUS_B;to: "background"; } + text { font, FONT_SLP_Roman; size, 48; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + } + */ + }//parts + + programs { + program { + name: "init"; + signal: "INIT"; + source: "PROG"; + action: STATE_SET "default" 0.0; + target: "background"; + target: "swl_cid"; + target: "swl_cid_background"; + } + } +} \ No newline at end of file diff --git a/ui/call_edc/vcui-view-incoming.edc b/ui/call_edc/vcui-view-incoming.edc new file mode 100755 index 0000000..4a7aaf5 --- /dev/null +++ b/ui/call_edc/vcui-view-incoming.edc @@ -0,0 +1,177 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +group{ + name: "mt-view"; + parts { + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_DEFAULT; + } + } + + part { name: "swl_cid_background"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: DIALLING_BACKGROUND_CID_L DIALLING_BACKGROUND_CID_T; to: "background";} + rel2 { relative: DIALLING_BACKGROUND_CID_R DIALLING_BACKGROUND_CID_B; to: "background";} + } + } + + part { name: "bg_alpha"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_BG_ALPHA; + } + } + + part { name: "swl_calling_name_bg"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: MT_CALLING_BG_L MT_CALLING_BG_T; to: "background";} + rel2 { relative: MT_CALLING_BG_R MT_CALLING_BG_B; to: "background";} + } + } + + part { name: "txt_call_name"; // call name or number + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: DIALLING_NAME_L DIALLING_NAME_T;to: "background";} + rel2 { relative: DIALLING_NAME_R DIALLING_NAME_B;to: "background"; } + text { font, FONT_SLP_Roman; size, 76; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + } + + part { name: "txt_contact_phone_type"; // contact phone type -> call number + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: DIALLING_NUMBER_L DIALLING_NUMBER_T; to: "background"; } + rel2 { relative: DIALLING_NUMBER_R DIALLING_NUMBER_B;to: "background"; } + text { font, FONT_SLP_Roman; size, 48; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + } + + part { name: "swl_cid"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: DIALLING_CID_L DIALLING_CID_T; } + rel2 { relative: DIALLING_CID_R DIALLING_CID_B; } + } + } + + /* + part { name: "txt_mt_status"; // Voice call + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: DIALLING_MT_STATUS_L DIALLING_MT_STATUS_T;to: "background";} + rel2 { relative: DIALLING_MT_STATUS_R DIALLING_MT_STATUS_B;to: "background"; } + text { font, FONT_SLP_Roman; size, 48; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + } + */ + + part { name: "btn_accept"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: DIALLING_MT_BTN1_L DIALLING_MT_BTN1_T; to: "background";} + rel2 { relative: DIALLING_MT_BTN1_R DIALLING_MT_BTN1_B; to: "background";} + } + } + part { name: "btn_reject"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: DIALLING_MT_BTN2_L DIALLING_MT_BTN2_T; to: "background";} + rel2 { relative: DIALLING_MT_BTN2_R DIALLING_MT_BTN2_B; to: "background";} + } + } + + part { name: "btn_incoming1"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: SIX_BTN_INCOMING_1_L SIX_BTN_INCOMING_1_T; to: "background";} + rel2 { relative: SIX_BTN_INCOMING_1_R SIX_BTN_INCOMING_1_B; to: "background";} + } + } + part { name: "btn_incoming2"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: SIX_BTN_INCOMING_2_L SIX_BTN_INCOMING_2_T; to: "background";} + rel2 { relative: SIX_BTN_INCOMING_2_R SIX_BTN_INCOMING_2_B; to: "background";} + } + } + part { name: "btn_incoming3"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: SIX_BTN_INCOMING_3_L SIX_BTN_INCOMING_3_T; to: "background";} + rel2 { relative: SIX_BTN_INCOMING_3_R SIX_BTN_INCOMING_3_B; to: "background";} + } + } + part { name: "btn_incoming4"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: SIX_BTN_BIG_END_L SIX_BTN_BIG_END_T; to: "background";} + rel2 { relative: SIX_BTN_BIG_END_R SIX_BTN_BIG_END_B; to: "background";} + } + } + }//parts + + programs{ + + program { name: "init"; + signal: "INIT"; + source: "PROG"; + action: STATE_SET "default" 0.0; + target: "background"; + target: "swl_cid"; + target: "swl_cid_background"; + } + } + + } diff --git a/ui/call_edc/vcui-view-keypad.edc b/ui/call_edc/vcui-view-keypad.edc new file mode 100755 index 0000000..4d293ad --- /dev/null +++ b/ui/call_edc/vcui-view-keypad.edc @@ -0,0 +1,482 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#define KEYPAD_EACH_BTN_WIDTH 200 +#define KEYPAD_COL1_BTN_L_PAD 40 +#define KEYPAD_COL2_BTN_L_PAD 260 +#define KEYPAD_COL3_BTN_L_PAD 480 + +#define KEYPAD_EACH_BTN_HEIGHT 138 +#define KEYPAD_BTN_TXT_REGION_HEIGHT 112 +#define KEYPAD_ROW1_BTN_T_PAD 0 +#define KEYPAD_ROW2_BTN_T_PAD 158 +#define KEYPAD_ROW3_BTN_T_PAD 316 +#define KEYPAD_ROW4_BTN_T_PAD 474 + +#define RIGHT_ICON_L_PAD 28 +#define RIGHT_ICON_WIDTH 70 +#define RIGHT_ICON_HEIGHT 36 + +#define LEFT_TXT_L_PAD 24 +#define LEFT_TXT_WIDTH 64 +#define RIGHT_TXT_TYPE1_L_PAD 28 +#define RIGHT_TXT_TYPE2_L_PAD 10 + +#define REL_KEYPAD_BTN_W(x) ((x)/KEYPAD_EACH_BTN_WIDTH) + +#define KEYPAD_BTN_LEFT_TXT_L REL_KEYPAD_BTN_W(LEFT_TXT_L_PAD) +#define KEYPAD_BTN_LEFT_TXT_R REL_KEYPAD_BTN_W(LEFT_TXT_L_PAD+LEFT_TXT_WIDTH) +#define KEYPAD_BTN_RIGHT_TXT_TYPE1_L REL_KEYPAD_BTN_W(LEFT_TXT_L_PAD+LEFT_TXT_WIDTH+RIGHT_TXT_TYPE1_L_PAD) +#define KEYPAD_BTN_RIGHT_TXT_TYPE2_L REL_KEYPAD_BTN_W(LEFT_TXT_L_PAD+LEFT_TXT_WIDTH+RIGHT_TXT_TYPE2_L_PAD) +#define KEYPAD_BTN_RIGHT_ICON_L REL_KEYPAD_BTN_W(LEFT_TXT_L_PAD+LEFT_TXT_WIDTH+RIGHT_ICON_L_PAD) +#define KEYPAD_BTN_RIGHT_ICON_R REL_KEYPAD_BTN_W(LEFT_TXT_L_PAD+LEFT_TXT_WIDTH+RIGHT_ICON_L_PAD+RIGHT_ICON_WIDTH) + +#define PART_KEYPAD_CUSTOM_TWO_LABLE(txt, offx, offy, file, file_press,label_left_text,label_left_font,label_left_size,label_right_text,label_right_font,label_right_size, right_txt_lpad) \ + part { \ + name: txt; \ + type: IMAGE; \ + scale: 1; \ + mouse_events: 1; \ + description { \ + state: "default" 0.0; \ + rel1 { relative: REL_KEYPAD_W(offx) REL_KEYPAD_H(offy); to:"keypad/bg";} \ + rel2 { relative: REL_KEYPAD_W(offx+KEYPAD_EACH_BTN_WIDTH) REL_KEYPAD_H(offy+KEYPAD_EACH_BTN_HEIGHT); to:"keypad/bg"; } \ + color: 255 255 255 179; \ + image { \ + normal: file; \ + border: 7 7 7 7; \ + border_scale: 1; \ + } \ + } \ + description { \ + state: "pressed" 0.0; \ + inherit: "default" 0.0; \ + image.normal: file_press; \ + } \ + description { \ + state: "hide" 0.0; \ + inherit: "default" 0.0; \ + visible: 0; \ + } \ + } \ + part { \ + name: txt"_left"; \ + type: TEXT; \ + scale: 1; \ + mouse_events: 0; \ + repeat_events: 1; \ + description { \ + state: "default" 0.0; \ + rel1 { relative: KEYPAD_BTN_LEFT_TXT_L 0.0; to: txt;} \ + rel2 { relative: KEYPAD_BTN_LEFT_TXT_R 1.0; to: txt;} \ + fixed: 1 1; \ + align: 0.5 0.5; \ + color: 221 210 202 255; \ + text { \ + font: label_left_font; \ + text: label_left_text; \ + size: label_left_size; \ + min: 1 1; \ + align: 0.5 0.5; \ + } \ + } \ + description { \ + state: "hide" 0.0; \ + inherit: "default" 0.0; \ + visible: 0; \ + } \ + } \ + part { \ + name: txt"_right"; \ + type: TEXT; \ + scale: 1; \ + mouse_events: 0; \ + repeat_events: 1; \ + description { \ + state: "default" 0.0; \ + rel1 { relative: right_txt_lpad 0.0; to: txt;} \ + rel2 { relative: 1.0 1.0; to: txt;} \ + fixed: 1 1; \ + align: 0.5 0.5; \ + color: 221 210 202 255; \ + text { \ + font: label_right_font; \ + text: label_right_text; \ + size: label_right_size; \ + min: 1 1; \ + align: 0.0 0.5; \ + } \ + } \ + description { \ + state: "hide" 0.0; \ + inherit: "default" 0.0; \ + visible: 0; \ + } \ + } + + +#define PART_KEYPAD_CUSTOM_ONELABEL_ONEICON(txt, offx, offy, file, file_press,icon_right,icon_right_sizex,icon_right_sizey,label_left_text,label_left_font,label_left_size) \ + part { \ + name: txt; \ + type: IMAGE; \ + scale: 1; \ + mouse_events: 1; \ + description { \ + state: "default" 0.0; \ + rel1 { relative: REL_KEYPAD_W(offx) REL_KEYPAD_H(offy); to:"keypad/bg";} \ + rel2 { relative: REL_KEYPAD_W(offx+KEYPAD_EACH_BTN_WIDTH) REL_KEYPAD_H(offy+KEYPAD_EACH_BTN_HEIGHT); to:"keypad/bg"; } \ + color: 255 255 255 179; \ + image { \ + normal: file; \ + border: 7 7 7 7; \ + border_scale: 1; \ + } \ + } \ + description { \ + state: "pressed" 0.0; \ + inherit: "default" 0.0; \ + image.normal: file_press; \ + } \ + description { \ + state: "hide" 0.0; \ + inherit: "default" 0.0; \ + visible: 0; \ + } \ + } \ + part { \ + name: txt"_left"; \ + type: TEXT; \ + scale: 1; \ + mouse_events: 0; \ + repeat_events: 1; \ + description { \ + state: "default" 0.0; \ + rel1 { relative: KEYPAD_BTN_LEFT_TXT_L 0.0; to: txt;} \ + rel2 { relative: KEYPAD_BTN_LEFT_TXT_R 1.0; to: txt;} \ + fixed: 1 1; \ + align: 0.5 0.5; \ + color: 221 210 202 255; \ + text { \ + font: label_left_font; \ + text: label_left_text; \ + size: label_left_size; \ + min: 1 1; \ + align: 0.5 0.5; \ + } \ + } \ + description { \ + state: "hide" 0.0; \ + inherit: "default" 0.0; \ + visible: 0; \ + } \ + } \ + part { \ + name: txt"_right"; \ + type: IMAGE; \ + scale: 1; \ + mouse_events: 0; \ + repeat_events: 1; \ + description { \ + state: "default" 0.0; \ + min: icon_right_sizex icon_right_sizey; \ + fixed: 1 1; \ + rel1 { relative: KEYPAD_BTN_RIGHT_ICON_L 0.5; to: txt;} \ + rel2 { relative: KEYPAD_BTN_RIGHT_ICON_R 0.5; to: txt;} \ + align: 0.5 0.5; \ + image.normal: icon_right; \ + } \ + description { \ + state: "hide" 0.0; \ + inherit: "default" 0.0; \ + visible: 0; \ + } \ + } + + + +#define PROG_KEYPAD(txt) \ + program { \ + name: "down_"txt; \ + signal: "mouse,down,*"; \ + source: txt; \ + script { \ + set_state(PART:txt, "pressed", 0.0); \ + emit("pad_down", txt); \ + } \ + } \ + program { \ + name: "ani_"txt; \ + signal: "ani"; \ + source: txt; \ + action: STATE_SET "default" 0.0; \ + transition: SINUSOIDAL 0.1; \ + target: txt; \ + } \ + program { \ + name: "up_"txt; \ + signal: "mouse,up,1"; \ + source: txt; \ + script { \ + emit("pad_up", txt); \ + emit("ani", txt); \ + } \ + } \ + program { \ + name: "clicked_"txt; \ + signal: "mouse,clicked,1"; \ + source: txt; \ + script { \ + emit("pad_clicked", txt); \ + } \ + } + +#define TARGET_KEYPAD(txt) \ + target: txt; \ + target: txt"_left"; \ + target: txt"_right"; + +group{ + name: "keypad"; + parts { + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_DEFAULT; + } + } + + part { name: "swl_cid_background"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: DIALLING_BACKGROUND_CID_L DIALLING_BACKGROUND_CID_T; to: "background";} + rel2 { relative: DIALLING_BACKGROUND_CID_R DIALLING_BACKGROUND_CID_B; to: "background";} + } + } + + part { name: "bg_alpha"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_BG_ALPHA; + } + } + + + part { name: "keypad/bg"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: DIALLING_KEYPAD_L DIALLING_KEYPAD_B; to: "background";} + rel2 { relative: DIALLING_KEYPAD_R DIALLING_KEYPAD_B; to: "background";} + } + description { + state: "show" 0.0; + visible: 1; + rel1 { relative: DIALLING_KEYPAD_L DIALLING_KEYPAD_T; to: "background";} + rel2 { relative: DIALLING_KEYPAD_R DIALLING_KEYPAD_B; to: "background";} + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { + name: "textblock/bg"; + type: SWALLOW; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative:DIALLING_ENTRY_TEXT_L DIALLING_ENTRY_TEXT_T ; to: "background";} + rel2 { relative: DIALLING_ENTRY_TEXT_R DIALLING_ENTRY_TEXT_B ; to: "background";} + //rel2 { relative: 1.0 0.0; to: "button/bg";} + // color: 246 245 237 255; + } + } + + part { + name: "textblock/textarea"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + align: 0.5 0.5; + rel1 { relative: 0.0 0.0; to: "textblock/bg"; } + rel2 { relative: 1.0 1.0; to: "textblock/bg"; } + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { + name: "txt_timer"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: INCALL_DIALER_TIMER_L INCALL_DIALER_TIMER_T; to:"background";} + rel2 { relative: INCALL_DIALER_TIMER_R INCALL_DIALER_TIMER_B; to:"background";} + text { font, FONT_SLP_Roman; size, 48; align, 1.0 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + + part { + name: "txt_call_name"; // call name or number + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: INCALL_DIALER_NAME_L INCALL_DIALER_NAME_T;to: "background";} + rel2 { relative: INCALL_DIALER_NAME_R INCALL_DIALER_NAME_B;to: "background"; } + text { font, FONT_SLP_Roman; size, 48; align, 0.0 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + PART_KEYPAD_CUSTOM_ONELABEL_ONEICON("1", KEYPAD_COL1_BTN_L_PAD, KEYPAD_ROW1_BTN_T_PAD, IMG_SRC_DIR/"./keypad/vc_keypad_btn_normal.png", IMG_SRC_DIR/"./keypad/vc_keypad_btn_press.png", IMG_SRC_DIR/"./keypad/vc_keypad_btn_icon.png", RIGHT_ICON_WIDTH, RIGHT_ICON_HEIGHT, "1", FONT_SLP_Roman, KEYPAD_BTN_TXT_REGION_HEIGHT) + PART_KEYPAD_CUSTOM_TWO_LABLE("2", KEYPAD_COL2_BTN_L_PAD, KEYPAD_ROW1_BTN_T_PAD, IMG_SRC_DIR/"./keypad/vc_keypad_btn_normal.png", IMG_SRC_DIR/"./keypad/vc_keypad_btn_press.png", "2", FONT_SLP_Roman, KEYPAD_BTN_TXT_REGION_HEIGHT, "ABC", FONT_SLP_Roman, 32, KEYPAD_BTN_RIGHT_TXT_TYPE1_L) + PART_KEYPAD_CUSTOM_TWO_LABLE("3", KEYPAD_COL3_BTN_L_PAD, KEYPAD_ROW1_BTN_T_PAD, IMG_SRC_DIR/"./keypad/vc_keypad_btn_normal.png", IMG_SRC_DIR/"./keypad/vc_keypad_btn_press.png", "3", FONT_SLP_Roman, KEYPAD_BTN_TXT_REGION_HEIGHT, "DEF", FONT_SLP_Roman, 32, KEYPAD_BTN_RIGHT_TXT_TYPE1_L) + PART_KEYPAD_CUSTOM_TWO_LABLE("4", KEYPAD_COL1_BTN_L_PAD, KEYPAD_ROW2_BTN_T_PAD, IMG_SRC_DIR/"./keypad/vc_keypad_btn_normal.png", IMG_SRC_DIR/"./keypad/vc_keypad_btn_press.png", "4", FONT_SLP_Roman, KEYPAD_BTN_TXT_REGION_HEIGHT, "GHI", FONT_SLP_Roman, 32, KEYPAD_BTN_RIGHT_TXT_TYPE1_L) + PART_KEYPAD_CUSTOM_TWO_LABLE("5", KEYPAD_COL2_BTN_L_PAD, KEYPAD_ROW2_BTN_T_PAD, IMG_SRC_DIR/"./keypad/vc_keypad_btn_normal.png", IMG_SRC_DIR/"./keypad/vc_keypad_btn_press.png", "5", FONT_SLP_Roman, KEYPAD_BTN_TXT_REGION_HEIGHT, "JKL", FONT_SLP_Roman, 32, KEYPAD_BTN_RIGHT_TXT_TYPE1_L) + PART_KEYPAD_CUSTOM_TWO_LABLE("6", KEYPAD_COL3_BTN_L_PAD, KEYPAD_ROW2_BTN_T_PAD, IMG_SRC_DIR/"./keypad/vc_keypad_btn_normal.png", IMG_SRC_DIR/"./keypad/vc_keypad_btn_press.png", "6", FONT_SLP_Roman, KEYPAD_BTN_TXT_REGION_HEIGHT, "MNO", FONT_SLP_Roman, 32, KEYPAD_BTN_RIGHT_TXT_TYPE1_L) + PART_KEYPAD_CUSTOM_TWO_LABLE("7", KEYPAD_COL1_BTN_L_PAD, KEYPAD_ROW3_BTN_T_PAD, IMG_SRC_DIR/"./keypad/vc_keypad_btn_normal.png", IMG_SRC_DIR/"./keypad/vc_keypad_btn_press.png", "7", FONT_SLP_Roman, KEYPAD_BTN_TXT_REGION_HEIGHT, "PQRS", FONT_SLP_Roman, 32, KEYPAD_BTN_RIGHT_TXT_TYPE2_L) + PART_KEYPAD_CUSTOM_TWO_LABLE("8", KEYPAD_COL2_BTN_L_PAD, KEYPAD_ROW3_BTN_T_PAD, IMG_SRC_DIR/"./keypad/vc_keypad_btn_normal.png", IMG_SRC_DIR/"./keypad/vc_keypad_btn_press.png", "8", FONT_SLP_Roman, KEYPAD_BTN_TXT_REGION_HEIGHT, "TUV", FONT_SLP_Roman, 32, KEYPAD_BTN_RIGHT_TXT_TYPE1_L) + PART_KEYPAD_CUSTOM_TWO_LABLE("9", KEYPAD_COL3_BTN_L_PAD, KEYPAD_ROW3_BTN_T_PAD, IMG_SRC_DIR/"./keypad/vc_keypad_btn_normal.png", IMG_SRC_DIR/"./keypad/vc_keypad_btn_press.png", "9", FONT_SLP_Roman, KEYPAD_BTN_TXT_REGION_HEIGHT, "WXYZ", FONT_SLP_Roman, 32, KEYPAD_BTN_RIGHT_TXT_TYPE2_L) + PART_KEYPAD_CUSTOM_TWO_LABLE("star", KEYPAD_COL1_BTN_L_PAD, KEYPAD_ROW4_BTN_T_PAD, IMG_SRC_DIR/"./keypad/vc_keypad_btn_normal.png", IMG_SRC_DIR/"./keypad/vc_keypad_btn_press.png", "*", FONT_SLP_Roman, KEYPAD_BTN_TXT_REGION_HEIGHT, "P", FONT_SLP_Roman, 64, KEYPAD_BTN_RIGHT_TXT_TYPE1_L) + PART_KEYPAD_CUSTOM_TWO_LABLE("0", KEYPAD_COL2_BTN_L_PAD, KEYPAD_ROW4_BTN_T_PAD, IMG_SRC_DIR/"./keypad/vc_keypad_btn_normal.png", IMG_SRC_DIR/"./keypad/vc_keypad_btn_press.png", "0", FONT_SLP_Roman, KEYPAD_BTN_TXT_REGION_HEIGHT, "+", FONT_SLP_Roman, 64, KEYPAD_BTN_RIGHT_TXT_TYPE1_L) + PART_KEYPAD_CUSTOM_TWO_LABLE("sharp", KEYPAD_COL3_BTN_L_PAD, KEYPAD_ROW4_BTN_T_PAD, IMG_SRC_DIR/"./keypad/vc_keypad_btn_normal.png", IMG_SRC_DIR/"./keypad/vc_keypad_btn_press.png", "#", FONT_SLP_Roman, KEYPAD_BTN_TXT_REGION_HEIGHT, "", FONT_SLP_Roman, 64, KEYPAD_BTN_RIGHT_TXT_TYPE2_L) + + + part { + name: "btn_hide"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: DIALER_BTN1_L DIALER_BTN1_T; to: "background";} + rel2 { relative: DIALER_BTN1_R DIALER_BTN1_B; to: "background";} + } + } + + part { + name: "btn_end"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: DIALER_BTN2_L DIALER_BTN2_T; to: "background";} + rel2 { relative: DIALER_BTN2_R DIALER_BTN2_B; to: "background";} + } + } + } + + programs{ + program { name: "show_keypadbtn"; + signal: "SHOW"; + source: "KEYPADBTN"; + action: STATE_SET "show" 0.0; + transition: LINEAR 0.5; + target: "keypad/bg"; + after: "show_keypadbtn_next"; + } + program { name: "show_keypadbtn_next"; + action: STATE_SET "show" 0.0; + target: "txt_call_name"; + target: "txt_timer"; + } + program { name: "hide_keypadbtn"; + signal: "HIDE"; + source: "KEYPADBTN"; + action: STATE_SET "hide" 0.0; + target: "textblock/textarea"; + target: "txt_call_name"; + target: "txt_timer"; + after: "hide_keypadbtn_next"; + } + program { name: "hide_keypadbtn_next"; + action: STATE_SET "hide" 0.0; + transition: ACCELERATE 0.5; + target: "keypad/bg"; + TARGET_KEYPAD("1") + TARGET_KEYPAD("2") + TARGET_KEYPAD("3") + TARGET_KEYPAD("4") + TARGET_KEYPAD("5") + TARGET_KEYPAD("6") + TARGET_KEYPAD("7") + TARGET_KEYPAD("8") + TARGET_KEYPAD("9") + TARGET_KEYPAD("star") + TARGET_KEYPAD("0") + TARGET_KEYPAD("sharp") + after: "hide_keypadbtn_done"; + } + program { name: "hide_keypadbtn_done"; + action: SIGNAL_EMIT "DONE" "HIDEKEYPAD"; + } + PROG_KEYPAD("1") + PROG_KEYPAD("2") + PROG_KEYPAD("3") + PROG_KEYPAD("4") + PROG_KEYPAD("5") + PROG_KEYPAD("6") + PROG_KEYPAD("7") + PROG_KEYPAD("8") + PROG_KEYPAD("9") + PROG_KEYPAD("star") + PROG_KEYPAD("0") + PROG_KEYPAD("sharp") + } +} diff --git a/ui/call_edc/vcui-view-multi-call-conf.edc b/ui/call_edc/vcui-view-multi-call-conf.edc new file mode 100755 index 0000000..7937bc1 --- /dev/null +++ b/ui/call_edc/vcui-view-multi-call-conf.edc @@ -0,0 +1,169 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +group { + name: "multicall-conf"; + parts { + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_DEFAULT; + } + } + + part { name: "swl_cid_background"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: INCALL_BACKGROUND_CID_L INCALL_BACKGROUND_CID_T; to: "background";} + rel2 { relative: INCALL_BACKGROUND_CID_R INCALL_BACKGROUND_CID_B; to: "background";} + } + } + + part { name: "bg_alpha"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_BG_ALPHA; + } + } + + part { name: "swl_cid"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: INCALL_CID_L INCALL_CID_T; } + rel2 { relative: INCALL_CID_R INCALL_CID_B; } + } + } + + part { name: "swl_cid_dim"; /*for held call dim*/ + type: RECT; + scale: 1; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + visible: 0; + color: COLOR_BG_FOR_HELD_CALL_DIM; + } + description { + state: "wvga" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: 0.0 0.0; offset: 6 0; to: "swl_cid";} + rel2 { relative: 1.0 1.0; offset: -6 0; to: "swl_cid";} + } + description { + state: "hd" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: 0.0 0.0; to: "swl_cid";} + rel2 { relative: 1.0 1.0; to: "swl_cid";} + } + } + + part { name: "txt_call_name"; /*call name or number*/ + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: INCALL_NAME_L INCALL_NAME_T; } + rel2 { relative: INCALL_NAME_R INCALL_NAME_B; } + text { font, FONT_SLP_Roman; size, 76; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + } + + part { name: "txt_contact_phone_type"; /*in case of multicallconf, it is num of people*/ + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: INCALL_NUMBER_L INCALL_NUMBER_T; } + rel2 { relative: INCALL_NUMBER_R INCALL_NUMBER_B; } + text { font, FONT_SLP_Roman; size, 48; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + } + + part { name: "txt_timer"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: INCALL_TIMER_L INCALL_TIMER_T; } + rel2 { relative: INCALL_TIMER_R INCALL_TIMER_B; } + text { font, FONT_SLP_Roman; size, 48; align, 1.0 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + description { + state: "end" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "btn_bigend"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: SIX_BTN_BIG_END_L SIX_BTN_BIG_END_T; to: "background";} + rel2 { relative: SIX_BTN_BIG_END_R SIX_BTN_BIG_END_B; to: "background";} + } + } + + part { name: "btn_speaker"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: SIX_BTN_1_L SIX_BTN_2_T; to: "background";} + rel2 { relative: SIX_BTN_1_R SIX_BTN_2_B; to: "background";} + } + } + }//parts + + programs { + program { name: "hide_dim_cid"; + signal: "HIDE_DIM"; + source: "CID"; + action: STATE_SET "default" 0.0; + target: "swl_cid_dim"; + } + program { name: "show_dim_cid_wvga"; + signal: "SHOW_DIM_WVGA"; + source: "CID_WVGA"; + action: STATE_SET "wvga" 0.0; + target: "swl_cid_dim"; + } + program { name: "show_dim_cid_hd"; + signal: "SHOW_DIM_HD"; + source: "CID_HD"; + action: STATE_SET "hd" 0.0; + target: "swl_cid_dim"; + } + } +} \ No newline at end of file diff --git a/ui/call_edc/vcui-view-multi-call-list.edc b/ui/call_edc/vcui-view-multi-call-list.edc new file mode 100755 index 0000000..5028996 --- /dev/null +++ b/ui/call_edc/vcui-view-multi-call-list.edc @@ -0,0 +1,109 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +group { + name: "multicall-list"; + parts { + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_DEFAULT; + } + description { + state: "show" 0.0; + color: COLOR_DEFAULT; + } + } + + part { name: "swl_cid_background"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: MULTICALL_SPLIT_BACKGROUND_CID_L MULTICALL_SPLIT_BACKGROUND_CID_T; to: "background";} + rel2 { relative: MULTICALL_SPLIT_BACKGROUND_CID_R MULTICALL_SPLIT_BACKGROUND_CID_B; to: "background";} + } + } + + part { name: "bg_alpha"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_BG_ALPHA; + } + } + + part { name: "navigation_bar"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + fixed: 1 1; + min: 0 50; + state: "default" 0.0; + rel1 { relative: CALL_NAVIGATION_BAR_L CALL_NAVIGATION_BAR_T; to: "background";} + rel2 { relative: CALL_NAVIGATION_BAR_R CALL_NAVIGATION_BAR_B; to: "background";} + } + } + + part { name: "swl_calllist"; + type: SWALLOW; + description { + state: "show" 0.0; + rel1 { relative: MULTICALL_LIST_L MULTICALL_LIST_T; to: "background"; } + rel2 { relative: MULTICALL_LIST_R MULTICALL_LIST_B; to: "background"; } + } + description { + state: "hide" 0.0; + visible: 0; + } + } + + part { name: "txt_timer"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: MULTICALL_LIST_TIMER_L MULTICALL_LIST_TIMER_T; to: "background"; } + rel2 { relative: MULTICALL_LIST_TIMER_R MULTICALL_LIST_TIMER_B; to: "background"; } + text { font, FONT_SLP_Roman; size, 48; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + description { + state: "end" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "btn_bigend"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: MULTICALL_LIST_BIG_END_L MULTICALL_LIST_BIG_END_T; to: "background"; } + rel2 { relative: MULTICALL_LIST_BIG_END_R MULTICALL_LIST_BIG_END_B; to: "background"; } + } + } + }//parts + + programs { + + } +} \ No newline at end of file diff --git a/ui/call_edc/vcui-view-multi-call-split.edc b/ui/call_edc/vcui-view-multi-call-split.edc new file mode 100755 index 0000000..5579bf1 --- /dev/null +++ b/ui/call_edc/vcui-view-multi-call-split.edc @@ -0,0 +1,728 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +group { + name: "multicall-split"; + parts { + + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_DEFAULT; + } + } + + part { name: "swl_cid_background"; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_BACKGROUND_CID_L MULTICALL_SPLIT_BACKGROUND_CID_T; to: "background";} + rel2 { relative: MULTICALL_SPLIT_BACKGROUND_CID_R MULTICALL_SPLIT_BACKGROUND_CID_B; to: "background";} + } + } + + part { name: "bg_alpha"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_BG_ALPHA; + } + } + + part { name: "swl_cid_1"; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_CID_1_L MULTICALL_SPLIT_CID_1_T; } + rel2 { relative: MULTICALL_SPLIT_CID_1_R MULTICALL_SPLIT_CID_1_B; } + } + } + + part { name: "swl_pause"; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_PAUSE_L MULTICALL_SPLIT_PAUSE_T; } + rel2 { relative: MULTICALL_SPLIT_PAUSE_R MULTICALL_SPLIT_PAUSE_B; } + } + } + + part { name: "swl_cid_2"; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_CID_2_L MULTICALL_SPLIT_CID_2_T; } + rel2 { relative: MULTICALL_SPLIT_CID_2_R MULTICALL_SPLIT_CID_2_B; } + } + } + + part { name: "swl_cid_2_dim"; /*dim icon for held call*/ + type: RECT; + scale: 1; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + visible: 0; + color: COLOR_BG_FOR_HELD_CALL_DIM; + } + description { + state: "portrait_wvga" 0.0; + inherit: "default" 0.0; + rel1 { relative: 0.0 0.0; offset: 4 0; to: "swl_cid_2"; } + rel2 { relative: 1.0 1.0; offset: -5 0; to: "swl_cid_2"; } + visible: 1; + } + description { + state: "portrait_hd" 0.0; + inherit: "default" 0.0; + rel1 { relative: 0.0 0.0; to: "swl_cid_2"; } + rel2 { relative: 1.0 1.0; to: "swl_cid_2"; } + visible: 1; + } + description { + state: "portrait" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { name: "swl_play"; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_PLAY_L MULTICALL_SPLIT_PLAY_T; } + rel2 { relative: MULTICALL_SPLIT_PLAY_R MULTICALL_SPLIT_PLAY_B; } + } + } + + part { name: "txt_call_name_1"; /*call name or number*/ + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + text { font, FONT_SLP_Roman; size, 58; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + description { + state: "portrait" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_NAME_1_L MULTICALL_SPLIT_NAME_1_T; } + rel2 { relative: MULTICALL_SPLIT_NAME_1_R MULTICALL_SPLIT_NAME_1_B; } + } + } + + part { name: "txt_call_name_2"; /*call name or number*/ + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + text { font, FONT_SLP_Roman; size, 36; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + description { + state: "portrait" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_NAME_2_L MULTICALL_SPLIT_NAME_2_T; } + rel2 { relative: MULTICALL_SPLIT_NAME_2_R MULTICALL_SPLIT_NAME_2_B; } + } + } + + /* part { name: "txt_active"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + text { font, FONT_SLP_Roman; size, 28; align, 0.0 0.5; } + color: 139 246 50 255; + color2: 0 0 0 255; + } + description { + state: "portrait" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_ACTIVE_TXT_L MULTICALL_SPLIT_ACTIVE_TXT_T; } + rel2 { relative: MULTICALL_SPLIT_ACTIVE_TXT_R MULTICALL_SPLIT_ACTIVE_TXT_B; } + } + } + */ + + part { name: "swl_more"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_MORE_ICON_L MULTICALL_SPLIT_MORE_ICON_T; to: "background";} + rel2 { relative: MULTICALL_SPLIT_MORE_ICON_R MULTICALL_SPLIT_MORE_ICON_B; to: "background";} + } + } + + part { name: "txt_onhold"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + text { font, FONT_SLP_Roman; size, 36; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + description { + state: "portrait" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_ON_HOLD_TXT_L MULTICALL_SPLIT_ON_HOLD_TXT_T; } + rel2 { relative: MULTICALL_SPLIT_ON_HOLD_TXT_R MULTICALL_SPLIT_ON_HOLD_TXT_B; } + } + description { + state: "portrait_icon" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_ON_HOLD_TXT_WITH_ICON_L MULTICALL_SPLIT_ON_HOLD_TXT_WITH_ICON_T; } + rel2 { relative: MULTICALL_SPLIT_ON_HOLD_TXT_WITH_ICON_R MULTICALL_SPLIT_ON_HOLD_TXT_WITH_ICON_B; } + } + } + + part { name: "txt_timer"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + text { font, FONT_SLP_Roman; size, 44; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + description { + state: "end" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_TIMER_L MULTICALL_SPLIT_TIMER_T; } + rel2 { relative: MULTICALL_SPLIT_TIMER_R MULTICALL_SPLIT_TIMER_B; } + } + } + + part { name: "btn_bigend"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: SIX_BTN_BIG_END_L SIX_BTN_BIG_END_T; to: "background";} + rel2 { relative: SIX_BTN_BIG_END_R SIX_BTN_BIG_END_B; to: "background";} + } + } + + part { name: "btn_speaker"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: SIX_BTN_1_L SIX_BTN_2_T; to: "background";} + rel2 { relative: SIX_BTN_1_R SIX_BTN_2_B; to: "background";} + } + } + }//parts + + programs { + program { name: "show_portrait_mode"; + signal: "set-portrait"; + source: "incall-split1-view"; + action: STATE_SET "portrait" 0.0; + target: "swl_cid_background"; + target: "swl_cid_1"; + target: "swl_cid_2"; + target: "swl_pause"; + target: "swl_play"; + target: "txt_call_name_1"; + target: "txt_call_name_2"; + target: "txt_onhold"; + target: "txt_timer"; + target: "btn_bigend"; + target: "btn_speaker"; + } + program { name: "show_portrait_swl_dim_wvga"; + signal: "show-swl-dim-wvga"; + source: "cid-wvga"; + action: STATE_SET "portrait_wvga" 0.0; + target: "swl_cid_2_dim"; + } + program { name: "show_portrait_swl_dim_hd"; + signal: "show-swl-dim-hd"; + source: "cid-hd"; + action: STATE_SET "portrait_hd" 0.0; + target: "swl_cid_2_dim"; + } + program { name: "show_conf_list_portrait"; + signal: "show-more-portrait"; + source: "incall-split1-conf-call"; + action: STATE_SET "portrait" 0.0; + target: "swl_more"; + } + program { name: "show_conf_list_portrait_onhold"; + signal: "show-more-portrait"; + source: "incall-split1-conf-call"; + action: STATE_SET "portrait_icon" 0.0; + target: "txt_onhold"; + } + } +} + +group { + + name: "multicall-split2"; + parts { + + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_DEFAULT; + } + } + + part { name: "swl_cid_background"; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_BACKGROUND_CID_L MULTICALL_SPLIT_BACKGROUND_CID_T; to: "background";} + rel2 { relative: MULTICALL_SPLIT_BACKGROUND_CID_R MULTICALL_SPLIT_BACKGROUND_CID_B; to: "background";} + } + } + + part { name: "bg_alpha"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_BG_ALPHA; + } + } + + part { name: "swl_cid_1"; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_SWAP_CID_2_L MULTICALL_SPLIT_SWAP_CID_2_T; } + rel2 { relative: MULTICALL_SPLIT_SWAP_CID_2_R MULTICALL_SPLIT_SWAP_CID_2_B; } + } + } + + part { name: "swl_pause"; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_SWAP_PAUSE_L MULTICALL_SPLIT_SWAP_PAUSE_T; } + rel2 { relative: MULTICALL_SPLIT_SWAP_PAUSE_R MULTICALL_SPLIT_SWAP_PAUSE_B; } + } + } + + part { name: "swl_cid_2"; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_SWAP_CID_1_L MULTICALL_SPLIT_SWAP_CID_1_T; } + rel2 { relative: MULTICALL_SPLIT_SWAP_CID_1_R MULTICALL_SPLIT_SWAP_CID_1_B; } + } + } + + part { name: "swl_cid_2_dim"; /*for held call dim*/ + type: RECT; + scale: 1; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: 0.0 0.0; to: "swl_cid_2"; } + rel2 { relative: 1.0 1.0; to: "swl_cid_2"; } + color: COLOR_BG_FOR_HELD_CALL_DIM; + } + description { + state: "portrait_wvga" 0.0; + inherit: "default" 0.0; + rel1 { relative: 0.0 0.0; offset: 4 0; to: "swl_cid_2"; } + rel2 { relative: 1.0 1.0; offset: -5 0; to: "swl_cid_2"; } + visible: 1; + } + description { + state: "portrait_hd" 0.0; + inherit: "default" 0.0; + rel1 { relative: 0.0 0.0; to: "swl_cid_2"; } + rel2 { relative: 1.0 1.0; to: "swl_cid_2"; } + visible: 1; + } + } + + part { name: "swl_play"; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_SWAP_PLAY_L MULTICALL_SPLIT_SWAP_PLAY_T; } + rel2 { relative: MULTICALL_SPLIT_SWAP_PLAY_R MULTICALL_SPLIT_SWAP_PLAY_B; } + } + } + + part { name: "txt_call_name_1"; /*call name or number*/ + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + text { font, FONT_SLP_Roman; size, 58; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + description { + state: "portrait" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_SWAP_NAME_2_L MULTICALL_SPLIT_SWAP_NAME_2_T; } + rel2 { relative: MULTICALL_SPLIT_SWAP_NAME_2_R MULTICALL_SPLIT_SWAP_NAME_2_B; } + } + } + + part { name: "txt_call_name_2"; /*call name or number*/ + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + text { font, FONT_SLP_Roman; size, 36; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + description { + state: "portrait" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_SWAP_NAME_1_L MULTICALL_SPLIT_SWAP_NAME_1_T; } + rel2 { relative: MULTICALL_SPLIT_SWAP_NAME_1_R MULTICALL_SPLIT_SWAP_NAME_1_B; } + } + } + + part { name: "swl_more"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_SWAP_MORE_ICON_L MULTICALL_SPLIT_SWAP_MORE_ICON_T; to: "background";} + rel2 { relative: MULTICALL_SPLIT_SWAP_MORE_ICON_R MULTICALL_SPLIT_SWAP_MORE_ICON_B; to: "background";} + } + } + + part { name: "txt_onhold"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + text { font, FONT_SLP_Roman; size, 36; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + description { + state: "portrait" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_SWAP_ON_HOLD_TXT_L MULTICALL_SPLIT_SWAP_ON_HOLD_TXT_T; } + rel2 { relative: MULTICALL_SPLIT_SWAP_ON_HOLD_TXT_R MULTICALL_SPLIT_SWAP_ON_HOLD_TXT_B; } + } + } + + + part { name: "txt_timer"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + text { font, FONT_SLP_Roman; size, 44; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + description { + state: "end" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_SWAP_TIMER_L MULTICALL_SPLIT_SWAP_TIMER_T; } + rel2 { relative: MULTICALL_SPLIT_SWAP_TIMER_R MULTICALL_SPLIT_SWAP_TIMER_B; } + } + description { + state: "portrait_icon" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: MULTICALL_SPLIT_SWAP_TIMER_WITH_ICON_L MULTICALL_SPLIT_SWAP_TIMER_WITH_ICON_T; } + rel2 { relative: MULTICALL_SPLIT_SWAP_TIMER_WITH_ICON_R MULTICALL_SPLIT_SWAP_TIMER_WITH_ICON_B; } + } + } + + part { name: "btn_bigend"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: SIX_BTN_BIG_END_L SIX_BTN_BIG_END_T; to: "background";} + rel2 { relative: SIX_BTN_BIG_END_R SIX_BTN_BIG_END_B; to: "background";} + } + } + + part { name: "btn_keypad"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: SIX_BTN_1_L SIX_BTN_1_T; to: "background";} + rel2 { relative: SIX_BTN_1_R SIX_BTN_1_B; to: "background";} + } + } + + part { name: "btn_addcall"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: SIX_BTN_2_L SIX_BTN_1_T; to: "background";} + rel2 { relative: SIX_BTN_2_R SIX_BTN_1_B; to: "background";} + } + } + + part { name: "btn_join"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: SIX_BTN_3_L SIX_BTN_1_T; to: "background";} + rel2 { relative: SIX_BTN_3_R SIX_BTN_1_B; to: "background";} + } + } + + part { name: "btn_speaker"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: SIX_BTN_1_L SIX_BTN_2_T; to: "background";} + rel2 { relative: SIX_BTN_1_R SIX_BTN_2_B; to: "background";} + } + } + + part { name: "btn_mute"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: SIX_BTN_2_L SIX_BTN_2_T; to: "background";} + rel2 { relative: SIX_BTN_2_R SIX_BTN_2_B; to: "background";} + } + } + + part { name: "btn_contacts"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: SIX_BTN_3_L SIX_BTN_2_T; to: "background";} + rel2 { relative: SIX_BTN_3_R SIX_BTN_2_B; to: "background";} + } + } + }//parts + + programs { + program { name: "show_portrait_mode"; + signal: "set-portrait"; + source: "incall-split2-view"; + action: STATE_SET "portrait" 0.0; + target: "swl_cid_background"; + target: "swl_cid_1"; + target: "swl_cid_2"; + target: "swl_pause"; + target: "swl_play"; + target: "txt_call_name_1"; + target: "txt_call_name_2"; + target: "txt_onhold"; + target: "txt_timer"; + target: "btn_bigend"; + target: "btn_keypad"; + target: "btn_contacts"; + target: "btn_join"; + target: "btn_speaker"; + target: "btn_mute"; + target: "btn_addcall"; + } + program { name: "show_portrait_swl_dim_wvga"; + signal: "show-swl-dim-wvga"; + source: "cid-wvga"; + action: STATE_SET "portrait_wvga" 0.0; + target: "swl_cid_2_dim"; + } + program { name: "show_portrait_swl_dim_hd"; + signal: "show-swl-dim-hd"; + source: "cid-hd"; + action: STATE_SET "portrait_hd" 0.0; + target: "swl_cid_2_dim"; + } + program { name: "show_conf_list_portrait"; + signal: "show-more-portrait"; + source: "incall-split2-conf-call"; + action: STATE_SET "portrait" 0.0; + target: "swl_more"; + } + program { name: "show_conf_list_portrait_onhold"; + signal: "show-more-portrait"; + source: "incall-split2-conf-call"; + action: STATE_SET "portrait_icon" 0.0; + target: "txt_timer"; + } + program { name: "hide_conf_list"; + signal: "hide-more"; + source: "incall-split-view"; + action: STATE_SET "default" 0.0; + target: "swl_more"; + } + } +} diff --git a/ui/call_edc/vcui-view-naviframe.edc b/ui/call_edc/vcui-view-naviframe.edc new file mode 100755 index 0000000..64eaf3c --- /dev/null +++ b/ui/call_edc/vcui-view-naviframe.edc @@ -0,0 +1,30 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +group { + name: "navigation_view"; + parts { + part { + name: "base"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + } + } +} \ No newline at end of file diff --git a/ui/call_edc/vcui-view-single-call.edc b/ui/call_edc/vcui-view-single-call.edc new file mode 100755 index 0000000..a7daf0d --- /dev/null +++ b/ui/call_edc/vcui-view-single-call.edc @@ -0,0 +1,221 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +group { + name: "incall"; + parts { + + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_DEFAULT; + } + } + + part { name: "swl_cid_background"; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 1; + rel1 { relative: INCALL_BACKGROUND_CID_L INCALL_BACKGROUND_CID_T; to: "background";} + rel2 { relative: INCALL_BACKGROUND_CID_R INCALL_BACKGROUND_CID_B; to: "background";} + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "bg_alpha"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_BG_ALPHA; + } + } + + part { name: "swl_cid"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: INCALL_CID_L INCALL_CID_T; } + rel2 { relative: INCALL_CID_R INCALL_CID_B; } + } + } + + part { name: "swl_cid_dim"; // for held call dim + type: RECT; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + color: COLOR_BG_FOR_HELD_CALL_DIM; + } + description { + state: "wvga" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: 0.0 0.0; offset: 6 0; to: "swl_cid";} + rel2 { relative: 1.0 1.0; offset: -6 0; to: "swl_cid";} + } + description { + state: "hd" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: 0.0 0.0; to: "swl_cid";} + rel2 { relative: 1.0 1.0; to: "swl_cid";} + } + } + + part { name: "txt_call_name"; // call name or number + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: INCALL_NAME_L INCALL_NAME_T; } + rel2 { relative: INCALL_NAME_R INCALL_NAME_B; } + text { font, FONT_SLP_Roman; size, 76; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + } + + part { name: "txt_contact_phone_type"; // contact phone type -> call number + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: INCALL_NUMBER_L INCALL_NUMBER_T; } + rel2 { relative: INCALL_NUMBER_R INCALL_NUMBER_B; } + text { font, FONT_SLP_Roman; size, 48; align, 0.5 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + } + + part { name: "txt_timer"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: INCALL_TIMER_L INCALL_TIMER_T; } + rel2 { relative: INCALL_TIMER_R INCALL_TIMER_B; } + text { font, FONT_SLP_Roman; size, 48; align, 1.0 0.5; } + color: 255 255 255 255; + color2: 0 0 0 255; + } + description { + state: "end" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "btn_bigend"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1 { relative: SIX_BTN_BIG_END_L 1.0; to: "background";} + rel2 { relative: SIX_BTN_BIG_END_R 1.0; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: SIX_BTN_BIG_END_L SIX_BTN_BIG_END_T; to: "background";} + rel2 { relative: SIX_BTN_BIG_END_R SIX_BTN_BIG_END_B; to: "background";} + } + } + + part { name: "btn_speaker"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1 { relative: SIX_BTN_1_L 1.0; to: "background";} + rel2 { relative: SIX_BTN_1_R 1.0; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: SIX_BTN_1_L SIX_BTN_2_T; to: "background";} + rel2 { relative: SIX_BTN_1_R SIX_BTN_2_B; to: "background";} + } + } + }//parts + + programs { + program { name: "show_effect_allbtn"; + signal: "SHOW_EFFECT"; + source: "ALLBTN"; + action: STATE_SET "show" 0.0; + transition: DECELERATE 0.5; //LINEAR 1.0; + target: "btn_bigend"; + target: "btn_speaker"; + } + + program { name: "show_no_effect_allbtn"; + signal: "SHOW_NO_EFFECT"; + source: "ALLBTN"; + action: STATE_SET "show" 0.0; + target: "btn_bigend"; + target: "btn_speaker"; + } + + program { name: "hide_dim_cid"; + signal: "HIDE_DIM"; + source: "CID"; + action: STATE_SET "default" 0.0; + target: "swl_cid_dim"; + } + program { name: "show_dim_cid_wvga"; + signal: "SHOW_DIM_WVGA"; + source: "CID_WVGA"; + action: STATE_SET "wvga" 0.0; + target: "swl_cid_dim"; + } + program { name: "show_dim_cid_hd"; + signal: "SHOW_DIM_HD"; + source: "CID_HD"; + action: STATE_SET "hd" 0.0; + target: "swl_cid_dim"; + } + program { name: "show_cid_bg"; + signal: "SHOW_CID_BG"; + source: "CID_BG"; + action: STATE_SET "default" 0.0; + target: "swl_cid_background"; + } + program { name: "hide_cid_bg"; + signal: "HIDE_CID_BG"; + source: "CID_BG"; + action: STATE_SET "hide" 0.0; + target: "swl_cid_background"; + } + } +} \ No newline at end of file diff --git a/ui/call_edc/vcui-view-ug-effect.edc b/ui/call_edc/vcui-view-ug-effect.edc new file mode 100755 index 0000000..80320af --- /dev/null +++ b/ui/call_edc/vcui-view-ug-effect.edc @@ -0,0 +1,98 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +group { + name: "ug_effect"; + parts { + part { + name: "clip"; + type: RECT; + description { + state: "default" 0.0; + rel1 { relative: 1 0; } + rel2 { relative: 2 1; } + color: 255 255 255 0; + } + description { + state: "show" 0.0; + rel1 { relative: 0 0; } + rel2 { relative: 1 1; } + color: 255 255 255 255; + } + } + part { + name: "elm.swallow.content"; + type: SWALLOW; + clip_to: "clip"; + description { + rel1.to: "clip"; + rel2.to: "clip"; + } + } + part { + name: "event_blocker"; + description { + state: "default" 0.0; + visible: 1; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "show"; + signal: "elm,state,show"; + action: STATE_SET "show" 0.0; + target: "clip"; + target: "event_blocker"; + transition: "DECELERATE" 0.5; + after: "show_end"; + } + program { + name: "hide"; + signal: "elm,state,hide"; + action: STATE_SET "default" 0.0; + target: "clip"; + target: "event_blocker"; + transition: "DECELERATE" 0.5; + after: "hide_end"; + } + program { + name: "disable_blocker"; + action: STATE_SET "disabled" 0.0; + target: "event_blocker"; + } + program { + name: "show_end"; + action: SIGNAL_EMIT "elm,action,show,finished" ""; + after: "disable_blocker"; + } + program { + name: "hide_end"; + action: SIGNAL_EMIT "elm,action,hide,finished" ""; + after: "disable_blocker"; + } + } +} \ No newline at end of file diff --git a/ui/call_edc/vcui-view-volume-popup.edc b/ui/call_edc/vcui-view-volume-popup.edc new file mode 100755 index 0000000..312fea9 --- /dev/null +++ b/ui/call_edc/vcui-view-volume-popup.edc @@ -0,0 +1,79 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +group { + name: "volume"; + parts { + part { + name: "base"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + } + + part { + name: "body_bg"; + type: RECT; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + min: 624 126; + max: 624 126; + rel1 { relative: 0.0 0.0; to: "base"; } + rel2 { relative: 1.0 1.0; to: "base"; } + color: 0 0 0 0; + } + } + + part { + name: "volume_icon"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + min: 64 64; + max: 64 64; + align: 0.5 0.5; + rel1 { relative: (40/624) (31/126); to: "body_bg"; } + rel2 { relative: (104/624) (95/126); to: "body_bg"; } + color: 255 255 255 255; + } + description { + state: "mute" 0.0; + inherit: "default" 0.0; + } + } + + part { + name: "volume_slider"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + align: 0.5 0.5; + rel1 { relative: 130/624 0.0; to: "body_bg"; } + rel2 { relative: 584/624 1.0; to: "body_bg"; } + color: 0 0 0 0; + } + } + } +} \ No newline at end of file diff --git a/ui/call_edc/voice-call-ui.edc b/ui/call_edc/voice-call-ui.edc new file mode 100755 index 0000000..bf8daa9 --- /dev/null +++ b/ui/call_edc/voice-call-ui.edc @@ -0,0 +1,59 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +//#include "../vcui-view-layout.h" +#include "../vcui-view-layout-hd.h" + +#define FONT_SLP_Bold "SLP:style=Bold" +#define FONT_SLP_Medium "SLP:style=Medium" +#define FONT_SLP_Roman "SLP:style=Roman" + +//#define IMG_SRC_DIR "./wvga" +#define IMG_SRC_DIR "./hd" + +images { + /*image: IMG_SRC_DIR/"08_voicecall_multicall_icon01.png" COMP; + image: IMG_SRC_DIR/"08_voicecall_multicall_icon02.png" COMP;*/ + + image: IMG_SRC_DIR/"./keypad/vc_keypad_btn_normal.png" COMP; + image: IMG_SRC_DIR/"./keypad/vc_keypad_btn_press.png" COMP; + image: IMG_SRC_DIR/"./keypad/vc_keypad_btn_icon.png" COMP; + + image: IMG_SRC_DIR/"vc_lock_left_bg.png" COMP; + image: IMG_SRC_DIR/"vc_lock_right_bg.png" COMP; + image: IMG_SRC_DIR/"vc_lock_accept_icon.png" COMP; + image: IMG_SRC_DIR/"vc_lock_reject_icon.png" COMP; + image: IMG_SRC_DIR/"vc_lock_bottom_bg.png" COMP; + } + + +collections { + + #include "vcui-view-incoming.edc" + #include "vcui-view-incoming-lock.edc" + #include "vcui-view-dialing.edc" + #include "vcui-view-keypad.edc" + #include "vcui-view-single-call.edc" + #include "vcui-view-multi-call-conf.edc" + #include "vcui-view-multi-call-split.edc" + #include "vcui-view-multi-call-list.edc" + #include "vcui-view-naviframe.edc" + #include "vcui-view-ug-effect.edc" + #include "vcui-view-end-single-call.edc" + #include "vcui-view-end-conf-call.edc" + #include "vcui-view-volume-popup.edc" +} diff --git a/ui/default.conf b/ui/default.conf new file mode 100755 index 0000000..f65a00c --- /dev/null +++ b/ui/default.conf @@ -0,0 +1,3 @@ +PREFIX=/usr +EDJDIR=share/edje +LOCALEDIR=/share/locale diff --git a/ui/images/PUT_IMAGES_HERE b/ui/images/PUT_IMAGES_HERE new file mode 100755 index 0000000..e69de29 diff --git a/ui/images/hd/icon/vc_add_icon.png b/ui/images/hd/icon/vc_add_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ff5ad9a30d01fe48478ea5440c9e73ad8f475aa2 GIT binary patch literal 3104 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 FV1iKtwA=sy literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_btn_more.png b/ui/images/hd/icon/vc_btn_more.png new file mode 100644 index 0000000000000000000000000000000000000000..70246686ea08a71eb654e2b0726de36a34c170d8 GIT binary patch literal 4287 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_calling_name_BG_image.png b/ui/images/hd/icon/vc_calling_name_BG_image.png new file mode 100644 index 0000000000000000000000000000000000000000..7b0b153dea986348c6ad40c6790566c677f12f6a GIT binary patch literal 5625 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_conference_private.png b/ui/images/hd/icon/vc_conference_private.png new file mode 100644 index 0000000000000000000000000000000000000000..0b7431d978a8692787b0b087682af3ab3fc79244 GIT binary patch literal 3662 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_contact_icon.png b/ui/images/hd/icon/vc_contact_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3cf5856cbb8cdb2a25f87d19872073bcc6120c55 GIT binary patch literal 3992 zcmZ9OWmFVwu*aVjq)S3tcWIC=1<75yJERd<1W8d!aOsYfW?3YpQxFgVr8|{g5S3Vg z7kFhsRO<5HZ}*-vGrx}$XJ*bn!N@?9nu3i206?v+rDk$PqyL z696a~{&NV(FJJ+H!tfCSVPxd)6X5g2-NzTIjX*$s{e9dXJ$3~kXc=pYG&9}4sd)0` z2(BBC%GC8SVIqT?z>`pnXg(nrIh{^CtaypZxaWqtIx+ijQ9Myenog2ElHZqg3`67-pp40P*by2Ux-E@^k*dA1N#G^9HKeNUGR z#RybFQsL!5MFWDu=JJ_>B4Xe;_Rx797>NK!{uf)H0Sfy&FBAf7GGR=RA~b+9xW=mi z_xqrB$|6x6ScwBhH{E_YuqXn=wJqJWKw}%|o}{B}0%TM`+&Df)5DnAP}7g z7&Q(p6@K2Sr^5?fO)9TRp`AxgJ;H`e#E;a{QuLOt8PWdXLy}@~`k`dCh zUkT#?6rq`}x+ROKj| z>!O5rpV-}=vgqkal3Nq4N((63UbZCo{x=)-;`H{VrOl0vMV)@Qjnk-Q*afoJq1*EO z@t<&ovyD^2sPjq>u0^D|e!wsX6c5aYTr zy>7hB9wd7x2eF(1LbqgB3^)U(|+j(fV~=zsM%<<@(>vSYDE!3jjHTNJuJfABpf~0 zS9&PV9A%^7JpH|JIyi+3io@Sgur?Ad5IfPxDdZ?NtHLSWZR{SK;Y%ahYyOT#(ULCv)| z4;B5d$;H`fyhq<329l9yv7MR{nGsFKinCNLi1y06Y|$Del+!K&68UL2i!jsvZ`l-+ zWsC9CHSV;_X-bG8@$Mfiq*DEl#YG4E;BW2;lV>~}d&5;rRWr!eXi-blk#PKQ>P;Xq zeS~^9xh!!Y9O`sSRm)1x%3x8e63W3NePfyYE;&)OaW6ktMy2jszV|o&^s_iiO2k=d z33JcWr!k1pg~lWL@AA+mASC(Q)30g2d2RNI{*%ThZxilq;VO)@78`fQ$g+!P6RBLL zF!auF%m#L&Z$oN>eFJuALxFWx@q7K-^t*t`sD}>gCf%m=CW&jVq^fyozR7B3vDpoo zv8JT}6Hzy{b<65XvOcr9GrONWYWNZG{>Ez7ErXnC%THt5nm=-W z5FG_lQO7bx4aFk`STQW5EJ)TsmWEuta@NmDtV3qvcO`an@p-g)KIT?JtwPV4(4!Pt zI$3;K>_TE@Rn_IyU#cn13Fc#FX;t>7Vf7m3Ql{%wz#v8%7?7YLBcRk>YCW65iK!BI`JC=AH>`6zIT z4dH$oBkcNA5M@qTPC4JA(d{z|rE?l78nnre25r}Q*1ZP3221%!_+Wgx`aAmj`6l}9 z<$~q+_3rBpO^i>JOw8xWU=$@5B=HzLW&yL-=J+7!fpBYO>pNHNri};X*88oU-Z2m4 ztjny-AJ{c()M4v*=R4{;DsEJ?8)O*N6wV|28h^Hqv{tpTHf}DG;ObkwTEm=>&dkWR zf%?AvjINBZ_hBjLilo$WOEfi{4>-f0y!B_4w~+smKUuJ^95!&2y)A~cnxdOplv;0P z7!&M&gf+!{)U3%_638KFqCT$(UB2SsuuN7 zSibvS`n~d?sGIfpoE6qe`>`&EoTyN}toP#&YiE0exbN8Sl zH>*VHh2^tV^x_TfW&W#5CscVenfH((kT;bgxRYS|{8gJ^Q<+s#p7H{{Cf2rfdawY_D z9Z{`__R^0E?>b#8MkXijE1SJGJ2LxgCcFP>wZ&=SxA)9GduZn`>3`;MHk~KuN+Ta| z<`8rJIk!32Q|;5{6Xp7Z>h0gzr(Sk-23~%9Lqwm5&PlmxS{K@9=Quwpnwg}{-`Ulq z8M^)90(%fBLM=;eo>DOQo!eI}cw_s7eC^~Gwfyq4k!OF9xZQ2e$GH1P9ooeQol^X-|xIXX?yrC;IIj|$zb`;GQUCI!D}aAN8uvlv*A!jK}UXl zyRB#Yen?kKsN2ald*R*5)uXQ9pEob(=L+Q%SGx!yJ|_bw$7?rN!~OZsC&xOL0{Qpr zIt@D=j#Tzkmk_IQbILXsD~ks!FFd*fiwH9-nkOVNQBxP_<1|{t^|ZXSu~_QZ-NJiH za&q65{m-}0DiBjHQ+$QY7bO>C^~^WL!hg^0E=IdR}(E)4j{ufE(-` zy!BxuNJ_%~$l`RbCvYW@^PqH%)^OuF^o78s`=2+*rqdOt8LSx@m&8Q5gtLcIBDgEP z34N$#q7Og_F94`00RCKFaT|cA;sES80wA9Y0JG0ahXD-$i2JnFRLz2x|H)U?;ZLST}cBJ6_nxskXA2kgN2=ngm-8V@-M`Sq_LPJ*;&-$)<{^DKq4=e80G@H z88SwW0(^ZNVR?F7SOesh=H~o^CqX%=85aoloW4y`x!#@9VJkYh9nib!AF+N9sK{bk zjC6Vk3Ib&-TU+H1!^1D4>6(NSx#|`fMPZ$I(VX4Q#l=NZ_cm8qjFT+J=P-ZWu?>ed zsKBPAq&$KTGZ-`8eaqINIvG>l6#pG~k0bjrX2R{;vkt@gg@wHVcqg`Z zpmCZJ3fthFB21Z9nawB(l>In35MwK`MVYge*YR@Dj73^%ZO6pK7<$R#W}~#7;PC?< zE#+;ktvk9h=m7bY`ucj9F(ZG#?TEU%I)bOC=W*H52tna2{E~9@pf{S%K`86*PW`Gy zJ-pb60rna(VP}0zc653!7F1~2-?sEv!^h_!?Y%t_EiLU727^h_(HB5#amZsQr=E6@ zd+2Wf6J}Pu^mKKT(2&e_njJPrJG<4YLZ#dt(9qDZa71jBq|*=iDprOs z!|S+MYvWH(PcMJS$B@HTMn^|K>ik(-T@5SsL}9VmRg$P;?VhNkyH{D6nVDC^!oogo zyHd|OGrR#oHH>nqbd@76lH0)yBOJGHUlwN)nwy&~LzD*vIAbgTtD+_pxIBCIY+iRS zAT;#UQ1D+NxoZ)a`lz4uQ+PoXYr;@KFb7XeT; zH8pcPJ3HQjvUoh+*~@D$#~-?S|XP2WcIT zfjmd5ca^M{mlp?7P&3V+)YQ~S^+iR#=uW<9Us`%7tY4EXc=tGDNK->Y3GFdOP$;jc zAl2hDjioz`x(PL3iy>qjL4vl9Lqz)e`kG#-o9Ns~(YUfT%1H54%*FQjB}ZDVos|qK zX3H;i{rRml(jLdgjZ0s_viJe#cr~tJw`M8ecHkL!#}jqk9gt8=tlKwOX3ZuJt!wen z=N1&a{=*jhtG@oCi71HqEspb~I!7)u9L1V8L@90w#^X!0#;#pedF?AJaFA2!pxxTp z5u#7%4^^eJCkl!=Yp~D<*Lz4c{#E%1wMQxb~H4c8kwD) zUDtsG=5V3O;KkEMqB)p!k2`Gx3&z|30w@cW^VRN!GWt~r>_R!oh(FW?1YK`m-FKV2 zgZ}mFmsk-4wy@B@n&`2+yZFxaqE+vPe{i`vOjq}BA+Ca%X#F`28I{*^u(yBU`x#$C uIX62iTtktbP!~Z3{ofy<_y0+Myav+7`4P4~JnyewAJA4eP^*VKM*a`HcXagt literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_contact_icon_dim.png b/ui/images/hd/icon/vc_contact_icon_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..30ed0163ed2384505150b81b7d9661a213575de6 GIT binary patch literal 3957 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 P00000NkvXXu0mjf%L7wj literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_icon_conf_call_end.png b/ui/images/hd/icon/vc_icon_conf_call_end.png new file mode 100644 index 0000000000000000000000000000000000000000..c6ddfea5c43b0a1da1f31be3104f6cf89c0f5c30 GIT binary patch literal 3737 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_icon_conf_list_unhold.png b/ui/images/hd/icon/vc_icon_conf_list_unhold.png new file mode 100755 index 0000000000000000000000000000000000000000..330c3ed411310de49c68ab4576cf63b0b973be2a GIT binary patch literal 443 zcmV;s0Yv_ZP)YiFcijb#Yki^$P+lp zWH2%D6?g*%AHdZxxG+27j)@Q86R_gy}bp_y~>H_OTJM4wEY36 z^iV}a3vSw2FqA+Gv_K2=KZ4%0t*Df80$?+_xp>kAysbO8vGtu!>8vOU3W8vXVrJXc z%6(6TMwz; lLJ(+y7HEMMXy^JAU;y1LVPcwimQ?@%002ovPDHLkV1nV{$3p-B literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_icon_hold.png b/ui/images/hd/icon/vc_icon_hold.png new file mode 100755 index 0000000000000000000000000000000000000000..ff00328365dbbe4ad0027d414abcf1bb33036430 GIT binary patch literal 2937 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 WdPtYV?~abWOo54krG6dME%v`u23Rcs literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_icon_pause.png b/ui/images/hd/icon/vc_icon_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..2134376348d224704404caf60afa79c9e6414f01 GIT binary patch literal 3696 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_icon_unhold.png b/ui/images/hd/icon/vc_icon_unhold.png new file mode 100755 index 0000000000000000000000000000000000000000..8d28fa476c59cf16744ef4367dbaa1c2c07da995 GIT binary patch literal 3675 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_join_icon_dim.png b/ui/images/hd/icon/vc_join_icon_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..15b25ec4effac2507650b18c91e11ab35685edd8 GIT binary patch literal 4350 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_keypad_icon.png b/ui/images/hd/icon/vc_keypad_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..75ce6ef1136e610021b75a682175732cbdf044ac GIT binary patch literal 5212 zcmZ9OS2WyR7sme+y^H8AdW#L@yzFi!Ko@${5iJA&ek;?+il_y_+CN z^hEpQ_Pf~6zBp^0v(B^je%3ERPe+Y}ke(0#01~LWvcY}V`&an5_xkqXarJ#8@KQJT z1puN){|W@;=FtKGp{|RPlAfNkr=O>V zr;3{K5gD4E22}Vg28u}$l&M^NtOVp5@vMdORQlZyRaCGUh6>`b-oA}UrqbspP9*$} zx5ZlYHo7=IapY<}xY%{J?P6#AwqZ^V^XUXpKY`bUPyAl}slIpw@kd4GhilP;eFN)T zf{;i;4ljTlzutk>_l6w=T!zWWJYnm?>i|Hnrit)@E^T<1Fk{>u*`8vK6)560sLL<) zKTZ4yN&ph{Rl}bm_1IMA_mdiO4Bx#|IY^mi4zNn3CBA?+o~fxIGY<+%^Mq2u?txt{M6f3? zhfXw7jBM>>3;+sJsqTM!a`OsBT7yDKylo`45!ma*y<@Yt-@M(PsPcjUz`9=;`j%g) zo<2evH^Tk4i1QHJ`595c%Znr@BpIXuDA-*vJ@NYIjY{FW=K1;Ut*!4GeTtTLBc`FZ zupXN((;K%xVKUbjXKNiB9Fd~dk!skNYdvG9TBVE=X#}tBmv&OruA7MNu9>FU`k?mB zW_*;J`V`)8m2;C%L`&Hc6w`S7Ij8O%Hdgtsu;f<7f!Y^xpx{)23hU=s=bGH)W`128 z7XWbF>e>B`2OlfKIeL8};O};RWe!23k$U+-d;m}`h~%qPU^wlj z4-RjsBNgOQ0@s#>(nyKRI zA_j>@EXL|g$Fe>Tz;RZpEveE&fN0cpY@3=$MkG>S_8W17QgekQ{cF`CqDcook=zvO z0{EoQ7kb%bi9*a|l{48wik#A*aMur7yr+F`!h!?6igo|-6Qn;Mtz-K{Ts1&nYw`)J zHR0^}L|p(jMWjj>fdqDdB8wffg1VWOna+3h3Km8Vv4;x;k_1?<^?SJ4(knE-aJ4-A z(?@GBDiUX=&d)wek@850JUCvdPm+ToK}nRm`P~C(U5U{Y#gyulhXMO8|3|o(Iz4;( z@PdOY5)Yig&+=p_W(%>^yY+O7VT<+Hk`Q4J@h-VE+~6@7d7(kKO};I*jq8{#s$g84 zYp`5VX!KA##X_;Vu+iYNeq6;Pv6s2v@n~wOW@&X%<}|%Cjq`=e=O2D850^8Ub+RT+ zr$%?xeq{Z?It?HuiKU7jjEC{i!D;bmVRQkspR={f=%$nC291OzMfS5XIb=DW#%6qt zd?8e+BZQe6nOvC+d_qPaE6XZZDv69wj7N=9K0Y%Htx+|8YPk84;M@Bu<4T0yz9EAl z?4xu=TqUf+(@4G~%={(+*SuG&S68V-zo5=$vu%Kd=s8{eD}Gj2lB(F3k>Y(^b>s6P z{(P<3H%zTbvXvhT!Aegxo|@JhoMbr3<85YpU*`Gg5MX%9vrfViS16BoH+UJ!#I%}4 z9Iad{-)Fryt5UDhuTtA@m#8@?N0hazw3=Tpa9eS!!BS8-2#n#p;c_`)IkmQ| z)LD&SrE4ieVXJaLr$_l=c7DgRh4^;BTyG{OSlrZdsI> zA2zmm#8`mMOU;Zetm{>)5!IZtt<|mN56hc%(sioxXJNgyzZ-`eKQ__TZhyyJtZ8&_ z47G#V)4-bgYkCjU+tWi^Lf_oT;*rG7lU6ZVFopSk@u8G5ky^<`l()|XVF;gAgVDg6eWOp}lM*zeMg_Cv1mO$=%R}v38h&Tq*6Tr2X9##b zyyu`|@$;d?q03?1(uXmz54`#2PkkqQhm_Xzx6$%MA2NkqS3ia6D(ObT8Zhia&xKM= ztLJK)N&_k{?2c&U&gFbQY|3rQNUn&knA?m=b~Oz(jq3J#=G(-qDuuJ(Iot)^p@H%U zP7n+$AyOgI^1;<*PzY=1TY0HP$8+TTfkJXYvjUYuN>p{!c6T+a^U%+C)vOnoY*Z@B zg)~Ml?8odRp52aJQg0YBcT8N2X{`KPuXrOl zoKLP&@P*8RWQ$mf{D7d7`PhsZ!VK!B$p{wYtC8?<>sY-$IEmXpY!Gb*(_{+`S$hQ* zqIyna%BepJQt(T?hiJv?{Fm`dft;^`I+^qMQ2^&#!oVJ;9vGVtS^^#aUCD}%S?5@t zPdg~>XKI^xAV>exQvU7c*W4f9wP}%PEyJbqsdN2V+(l)j+C`$%Qr~$iRc*Cys?>^y}3lKIcmi;iY;F;sYL&6+QojS)8M!@f@@}Gs;=X)3^Ew$uLU1sEyg9k@uiNrm$y)&%#H%-6(5KKB{j zssq!kny_}RAZ^#kXWb)F-3=hueIjGR?U>O0rMUxZT{9u`)dsu2u?Pk^s)WQE%0-$i zs_^eTORu&W;ygz>bCxo`e5~qgc9?LQa@yTl5y-bBeP5ZilSS%5GQaSJWYy%$!P&XW zqEOa2&thwIqf&Emr_9$j$MRv+xU{@ciP5RiUn7abspST{xl0f9AwzK6x!BK{Ma#B} z8@b_*MPrb$_Keev;}!I({zAScp>p@~{gu0QwT`>@!64QY)(svzY2#e;w;84>StEm# z*(dvIq=Sz;ZV^WT0wfY7#&7ZlHrTzC1GjcB2v#qcNu(D1lY>94<4r&IXM!;ay->_O z&Q*mQ=3ZIaTej$q$)RWWR)Vh879W%4iOHA;YMdAiyDaQRO{c?-Cz27Fh|n;>KTEcY zMUBCj=cv^eWS&PYdp)&%dgVu($nv-v9eFDpFb5? zyys1p=jsO901(6p01?pu@aOKn?*hO}VF1{(1pujR0HEd51?3-RJFtZQ8@3T8zW2Y|a)jLwrc6-M6- z8W@TcosCuIKmeeKn}QT_<&)x}#DBg;FNgb7f6 za7p^hyQR%l%thOEJ|>@?0~*EVOOqJ|0aXA-03Sf5|4$+aAu5#jf>ZE7FV&I)nzj=H zssPoJb>Rcd5gA*Y4`^|I;Q^e$m-_G%W}pFB0fafDnF#=_HD90;NAIaAZmz?c=h9d2 zi{tIl(YYFHxMTf%fk{>RvKAXT{#Ic73hC!L&GE4@8Q-0;9KDw>8%Ec?WR{nf+K`2X z-S2X8a=xtB@>el1GWtE14-3IePU^`=gpX~5p&+aFpflak(NTRpJ(eU%a%>QMJhr8! z1&6rz+RfH>jU{4os#G)F@9yS8zSh2)j5a(Jp+TZdY5Ug`7>uR`i!is;Tn6@oNKih; zro(4jL&wf;ecHcOR;d^rvcJ35Ix;k*e!bD3MAP={i2HH)_3ulhde9#oW^r+qF8={ zLoR>4n|E6|y12q}A$sR%zPmM?eiw8$V_KEM2sV%w5fMS1v~fs6qProPnVI1HR~rPQ zkyv;}t^NlVjKsM65}qp|fA5`$cG>Sq<9HYy9i6ZCI5dMOu2(h^vKFPmd6zF>j@$}A z%o4JBtIm-I27^B$a&y_HW*_h-_N=rAH+VEz(j@iMDv<9SaQZnqZm*It%lt@IX4_@J zB8Y;hs^Y4ry%tOH{8e67CilY4jS;zc&`M8FkDQVtN-Fx#b1+el=iA)!@=da8ap1z{ zZ<#fp<_wRqfF%xIO2SYS@@GExhY+7&OG`^vUtix5lC2tG=%h_~+Almj{4O#vG0{fu z?3*EcVR3N=H+uc>KXojKiHV8B{%m!3M~B?}^Yy;IzRr{5<3>|c(-dN2;_D?hiB;=N z{E3r3bg|n0{k`?5eA%jW=?{$ZVKPWx42mAma(6%A)+w)#!vyM6s(f8O%w>}H7b_8m z6r(FFnmm@3?yV%-#$YxVN4{E8wJvv5)YqSw$J&v~;&Piu zaym|UzIdT%XqZ0r2CAmNVBYk|mTz-Zl8=VBzr}+LA`-(H+ie?9NliTfDyXgXQl#w9 zc&O#X1O*Y}MsxS9|N62-ROBMXmbk&-=;){b@CXRph|v<~+tPBeHq{IdL&Jq>WxOqs zwI)@|RVGz)-i%G&{!h2?tAD8Z2&L zzy}oAgnRQYL0ORqLIyd^b;0d21zyANeEsWrfs(uxA{J5>g)|PyBkGFj-7f$V^q&(e zmuut{f1402T;;tZCqf5rDchiS{Fx7g5>N)LuppXgVs`*S2d3@s?_ZC0c0<2tm>*`A z<$ykzI59*!pUQTwhELkpT>>1)`g-1Cv{`0WR@1Vr@VAdMdnE$TC{)VuyFtT&c~ z^Ua$#CBqJB#d4-(q@+?QOw#A@$jHcsCY-fK_r)+XE34$-qjuBAf($sEC}r?@tr@@k z?(Xg|uJAJ(n7V!dQair};AX2z!P9IMsu*IEFK*W_cUB&}e;+)sE1G%qONb-py8r z%dG*A(femYXffITlMoHRDY0>as9&NAip0j>) zv1-ExouW?TxcDF+z9J0<4-Z%Cl4JMTi`c+m7)wf(v$$S63-Z^e?y&g-{~{zZt$>Hn zqlsa$(R~#A-B+*mC@Jcs;X{*kuWXa5ned+n2g@bXyIR0^=@!J9d(qr}w>RVCl)-st zF)5Gwd7VAK7ETUmO%adA?B%F1@nh1syVMf$HvCkF%us;QQlS%%Kj@OzD$0PG4DKK35oOBLZvurx!cRlmmJVAPAJ6_ zXd2%P;vl2dOHD0q=hu2~?BSuu{__;s^PwV@B$OWIjD)DDs6bY}t?;F8)y!XXFPVIs z+s)szT8rws`**UZcZpFAqdsat8`#Q0H0K>0o)jC4yGbO}RtqVgKD)fRrE5NIJ6~|c z$S|keyFq_-btObXMs`ul&)`TqASojw!$=r&`NePDjGwxkXKx>s&~H!oL{N~qkY}X# zq)lH?wovZ}O@DuXRnNNDEZ*agceb>uW22*RaPT?*zJDucQh!ulUfwCztFyfs!_v}H z?1_^cY=trPv{O_xnVeaxU2p6v4JD1yI#b7yS{^CEZdY-QC^cgZC&=x>G4%{o3Bm%gxi?&7DDAQIWyj!_C&g*#-c7S7G{gVEsdKX~gE0f@Tyn zP18+}42wZeAr?xS%*w%tO{5XUShPY0>U*xNj7~FB7=@OQ0F5I9apA?_EMx957AJfv ziHaG!+X*OfTI@vpoOos0o6Ep?H-F^v}0H4G#|O?D5Ej;IOy@ zL|9GMjGhn7D8NmyloTgZFJ?D@;yZ_n1@vm?_VUq2J`o-%WSgQu!%%v?lEpN!prnAD ze}Y08Ag6)?g=Mko1BK{-`M8zkF7TQgFn{&&=Ntfq-DC%#0B_P5$xsTD0R|GAC?&vN z5~!Inh*1WN_yAH{%|UTsnH%6!H?&m)8rp!~Ng~`v01FS`14V_i1Ly&O`3N(!FA$au zkg8l5N}Y4o5gl+Kk;-nAg0qM#hrGe!evfHr$V1OIsZPO3Dq?|Zkt4^`@0U#_5F$jl zefb>#3X{o@x4nGuog}E6oD@lDB{1VY>cMzovb5ZN+@Gp;mji$uui%+SF5V_;s3Zo| z<+1qXDZ2eT+`zil8LWA0W+L`isI+J}+Eqn<;ZPioW1Hd~a79Q|elk6}S04NoPa5Tu%T=h|M^*rM2IVW9q3OsN%`&8+RuZwDzY1^6S4 z)VP=zi4#e9i2|Y&2Sr(kqZI{S!IMzczkCMI63?p4y6Q0>a#iLEsZlehj;>leHDZdV zaWQa?gzv%j2KEH^X!aN{-r&G2<=%h3(f`4wH|D58wNJD!w2xtvB_Ize$hD%!&u3Ias$j2=^=b6&DkUo-tL!S= zz_Oo%jUS>hj0dy^bQM2?3cr}`b`CM%T2VFmaxpsLS4VsZ5gugyGO-fq&C!wdK-Uo~ zT~%2mt|+J>XxOB8nPw}CxtsO=CeKR;`+%)H^D;PQlk|-J2RlufkQSWZ#?+}QBQwLO zTCEyXt$N%gQg>1gE9+A3Fun^RkRR4~W%^3hE^+c1>_C4-f1@0yoLpO4;<}Ef%Bhs5 zs6)x8$F=-4E5G|4G+)cDeABP%;2&)e?*sV3|P+3?w#lCi6~ZgT7s59P-*3O%Y8k3+}d( zjI$3q!1QzHRP8A2;GUl@qhg~qL&teCWq5LFhBijJ_B6b%-@o1QpS_0VHs$u8RIJsX zikv!}My?lp7b;-SHx~4q9vD&F2JO$t;ufUyIc?Ph>niGo*tHxm^IGvH8`ds0w3Yf) zAuP@)Wd6!{6zt0EN{Ma?Y#N(=7wv5uX&cuaaLYFf-%|X@{AB&)|1<-XLtmoUp+$$t zhrB_(yYUZX>`9Q7ShM-txN;&NR|uCUlTQq-4c+gnWwampom9(+ILMkzo^&7xe;xd5 zaT?R&r$y{QFy5>1$Z*35*#!3}BkCFcOktmybw$rDrGH8pN}IWM{JP@x+#13hGF3c| zQmdlvLhZ6cJhsN)7mQ#=>du<9;yfI6BCgKeTlXiIkw0KRaCZYJvUo?{y89JP_FsjU zlUMQ(b4g^#X+`OXrTvj7;;0~xdwD_P^D+U)ub-~pj)`|hWF~4^(UgN;=R%D`+dt)Z za;LB#%QwMNu6=metIDKKEqtwwT#0=09B&2}0cnXY{!b~%N$(Y^7`0Pd?T+kz+Io-I z*n~Geeshg&9Cd0+s(EJ2jnk@7_6uynw#0$iXlG+++cOb8CZ189&pC1Oy=iPM zNi^@Q;OT_8pLi#wwKPK0keklvXIG7*c%#&Nzcrj)vS*wT1{gI`Ut?N1To!bzPYg5b zg1cD#wVguV^^Jx0wV*g1<3e!u!-J03mrma58u1!$wOIU%fYHd1MaR^Uu2E!?eOzW+ z_uZ$7bQ|l*UQcVTtR940Pub4e9{$|q&VNIYQI+{KlfV^!WwjZ9%b@w>`mgdDZ{`Hs zTF0kWMR-Y%)Ynd%^3ll&Nm=k`@D=zUSmbneqs3zB#&zbDCZO}L(C>w{H=T$FnbGbw z2ns}d!FIvsPW`S4AzK$+b$F9;=km5z$L0OWFxo8I112*;>k@o^fo@hBte3dRd8|q> z{G$62cILy4FM>gUH7}p%;M3e|Gnzk3&K1hDPup4OYo?}>S5?ys@=s@94s9c6wGtGZoXFB8gO7W zx#dXccGgbhwKJ>y6nh}qDLH9+@zv|1ac!T(@T*}?y@Z*|k=K#bW9ppla7SK8P95CT z34ZF|)e>NfIHbuJo!q$U@;fJgT3pB%m)_{Q^mjviLtJl>Zv=b1dYByVSn+vvTHC4H zX?7)dBEO=z5xF4y=5c-bZ2hBSuTSCS%(^N9BmC3UWAb$(q2jZ|?8Na1{D|XxF&T03 zAF>_~hxg@*Q`S?g`4o@EkK=U|jcdoWG$rAbS zlOX-nvhDqI;=DnfJackM6&Pjz_a#8pS;J1(}4hR{f zO*y@aNf}aI6@>)}Wk|BeV#NMTls7*plC9;OM>RDZgj?uepNpE!PdV|?YNFrs=i|>! z&r@*(o-$TQsUd|6V*_9Ua6`%EG|A;~3!hD++K-~zqcs1w*cF#`d!Jogp#dxa8K_18 zRA4(hAD~3zLzP1>lnv04gq`V}_She5 z6n0t!cio+K@S)NJ?zE8+5g2=yeloNKm-RN-h^wotABIOqN4Ha>+Dg+8siE+K8inF zFPRwzA~t-|_4W0|ArK28xy*5!M3s{JWM~=h|7gc)P;=9B+~Txk>Fu4NSw44lbtMF87EC(u%aaMp zN%&^j>MT<2kYmuG_$wnLoE<7PL3k}CHddWG5;C!ywV>+0%0EzHa?Mko~7 z2LyDK{3>avJASri@L8|&@bU5S7;m5k2{4Wd)AMTT%VJ*kbd6FQdpAoetU zI5wCYMi>BK2w5>3j?d{jd|`dv)aU-@yfonN?;=y4rL`}~7|_{Sz5VUJPqW+Gg*)Bu zj*ds_e3bWHwYA)mQc|6R$JgC&v!kl2#6CU-7M7Ps9v>e!QPJu0n0_s!mG*BYhPEQf zROv33rw2*@)t+F)W#D)7XU80b=GCz=ulgd0)X~8K8v=psY|Vbngs_obz@+>d)l*ok z1*p_guI6QDguW9zK12C+?%UwB#4~rgwXzaDIjK`ktsmDoW?WBFnEkk4fZ+LD8;Uaj zVWSxYH?0eFajC@tkR0)}wH3Ui8tw#GQ%5618TR7olh|VX-Y%(@%v7KQ@$vDM)&k-@ z>M1*5#R2`@WX3cuAeIn7Fdbe_N7O9;=K>G_F2a)f(eNS%(rs*PT3p)#zHGSqeD^t) z#|o*c@?cH%BT5{`43a4Tsd5$ISVbw>{vfNI7rvYA$_9nK}?e4j*NZ7HSj) zt+^1ji>r&vwfBb)D`+85P&mpdQX-}o1B9~faMM#C0REZ{Y@)9}*NNn2Nh3vZ za)CZl>G@|pPu=f*eZ?+K0D1|pikj|jdNQ(z+Yf1(nI+ZLvFEpeeNIbt;=rDW^YZJ} znHdmuyov?7)V7160t<29W>*0G4sq7w(KOo$)V*n&Obg21Ivc(_>v4-6-W3AChK5Zq z0{?`ZhXWDv+S>TYhO^lXt}~Je6>6atl$6vI$d21~7qg`$h%94^$t^n!r%#LwLV5Kx z6?Lme^FF6cSv`f^x9c6ncw<@o%siDCKYvkybU;S%SrC7P)Vc{$-E!};*R4*v|a5bl(Fe1q{PGH*Q|3M0- zLzAE3kQ3o7!kH)K=Mi^sOC?WqkyA$ICeBHUQ&d{|OlpdmJa%WgNRbwJ7>cI>i{uKg z=QCjWA?d)!$JdayD|XiuSLTZ%K}*0EQ+(hd&Ye2ChZ-W6xBE4mYuw1CVLIg-aYx$nC`auHoQ8FOGI`CsuMvnlO%08qx_4bUAkvrR z$L+%vD$L5Dkv-%GJ<}}sP{w^*4r*hZPE`C{fvt&it&Df4D*!Qz>|9p=?(Sg7_ao$e z)9RdZaI3kyyW0rzP8r=}?%8@;`Z)3DM}fI-bQ7@3pgaxS+I%NJg5CaWacKB@IokcB!5} zh-U}c@GhjD+VBge5TCodWyUW9YpbffOMWApS?TrlHCZTwSn$KO;oB4zVmyo%U{;b#)z^SRJ?`vyo-<2>2_W}9ho~$=(ZawV5J!T{O9@9cD5IehatEqhHzu#gh zXl%>jaH@%kiH~N41OyU24}aGtbjs%zS63Yco&IJM{Hd<*wzM&}b=&NO13(6^8A1IL zZvKIVZ7_AT(w}kO9x=)Y{@>$eOQ?TtbL*?BIPAj*UE4}JJ3AR#V~Sf8m##%ywRhs5 z-Sp%-3rgH=VL@3bq(?nvNBQC&4O+d`QmjoHCmWr4NO9PK*M^3f=`5qoV`G6s{Jc;k zQFhOLO-20WNJvO-F$w9{OB_rv00`v8R(DW9psnrDpEye|FCjr8A)&{yl|?B@k}8xi zl=;4_)`Ww0Typ>lEibrVLjeO(C|H#Csu=Dxy`oL)*mYV??Z44U;f{Rpfp?m h--kdm-swHj0b^<3alJ-dF{|CzazO(=U literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_mute_icon.png b/ui/images/hd/icon/vc_mute_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e8205c12bc10c41f2e19aa1e300e47b12d2354a3 GIT binary patch literal 3897 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 z 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 z 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 BirD}F literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_qp_caller_ID.png b/ui/images/hd/icon/vc_qp_caller_ID.png new file mode 100644 index 0000000000000000000000000000000000000000..fa4f11395f395b07d275823de76c3bfdc57dde23 GIT binary patch literal 2772 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 Hu0mjfIask9 literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_rcs_share_icon.png b/ui/images/hd/icon/vc_rcs_share_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..756347cb3b1d6013e19f600453e75567877a2687 GIT binary patch literal 3580 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 J>tGJg{|EC2k!An@ literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_record_icon_dim.png b/ui/images/hd/icon/vc_record_icon_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..d2d95234305a13b8e7eb56742115cc3e9c84740c GIT binary patch literal 3530 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_record_stop_icon_crop.png b/ui/images/hd/icon/vc_record_stop_icon_crop.png new file mode 100644 index 0000000000000000000000000000000000000000..3048ae910d960628cd63dd67fb7eed6ff974b11c GIT binary patch literal 3117 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 Hu0mjfLQBrJ literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_reject_with_msg_header_icon_others.png b/ui/images/hd/icon/vc_reject_with_msg_header_icon_others.png new file mode 100644 index 0000000000000000000000000000000000000000..4fc9dfa92b33e61e2360138137b741581fad45c0 GIT binary patch literal 2934 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_speaker_icon.png b/ui/images/hd/icon/vc_speaker_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cda8b8239832b4a4b0d074ba4bb1e1ec70742d49 GIT binary patch literal 4061 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 Cc9nSm literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_speaker_icon_dim.png b/ui/images/hd/icon/vc_speaker_icon_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..6204bba2547e556ea9fed0919f9bfa72f80a057e GIT binary patch literal 4067 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_volume_icon.png b/ui/images/hd/icon/vc_volume_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4039b0d233479ee4c41e832d00be8596a7f5fd83 GIT binary patch literal 4767 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_volume_mute_icon.png b/ui/images/hd/icon/vc_volume_mute_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..62145992b4c55d2727ac4cb8b7b4c436a67adedb GIT binary patch literal 3982 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/keypad/vc_keypad_btn_icon-1.png b/ui/images/hd/keypad/vc_keypad_btn_icon-1.png new file mode 100644 index 0000000000000000000000000000000000000000..b2396b63be6012c4f354f616b7ed57b0b441d81a GIT binary patch literal 3875 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 Bx4i%W literal 0 HcmV?d00001 diff --git a/ui/images/hd/keypad/vc_keypad_btn_normal-1.png b/ui/images/hd/keypad/vc_keypad_btn_normal-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f17991d88bb5a7820fd7966876d172bb295c7e76 GIT binary patch literal 3392 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 EKOSB>&;S4c literal 0 HcmV?d00001 diff --git a/ui/images/hd/keypad/vc_keypad_btn_press-1.png b/ui/images/hd/keypad/vc_keypad_btn_press-1.png new file mode 100644 index 0000000000000000000000000000000000000000..74ef761d5c82bbc2d55b4341d2b586fa6ea24f61 GIT binary patch literal 3270 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/vc_lock_accept_icon.png b/ui/images/hd/vc_lock_accept_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a4367c624e0395955b50800f5b1597f7ae4264be GIT binary patch literal 1276 zcmVR#tvHIXMZj zoK8Pbv-ML18XVA>-^mKCOEC4vcO%H-svOCS_B z7!2+y5lp*?Oo>)?s)30&S1PEgs>%~P^kx{QU2&7hqN1Wqu_w{#bYMxnlEAD;c&;WT zfjO9;pZ7{}qEIOGKv7_Jc6NeNoG2qBLx)}rN&&O%bUK4loebT&+foIL_M%&!R;z`V zL3GT03C~#pz$Nz&MYo2 z;?{;M8U+X!%onILN*v*esxhF#!om@PI-{z6rMtLmy$r(~sG|5r>@+?;et>gec6Ro) zRGJrwvQl^~Us3TI*GtLD8XBxbWT#}+8XBwwdXH--kl*irrV1;8^m=_K;X=59Rmt9U zImvcPqH7H;RtirJ$HvBf;vNilD38bUQ1MpcRI|UoAHdC;$-rgQpL&ktANwNksGc)s24b6#~*4EZ3 z(jESZiHYZm2ZL0yw6x@r3l6nl;JAi{h7KXUAwuD3&f4B`s0RZvG&J-*8E`aQ8*P1k z{inLRx|`I4K`PkX+&mHjXLNMbgb4*&Y5%p+Lg61{F4@!5^Cp(HWCsIb zHk4+uLXa6Aq`-+2r^8 zgRFciPt*#YC>0kM_hw~f-9Xm*A=4$~C2|E%lEo&k*W1pm2`59acGO9&m15N%x7%$= zFcd2+$kSSU<3+W{<8dY+OYTrPju8+BZlg}DUO+ZdIr0?~KA-O?_s}V+>~QCycCI8< z{eg#0xds6o+cZ8U}fi7AzZCsS>JiY|D%IEGZ*dUJInCzByVYvTJY7A`t(SgKdgKJiJdP@=tv zlT}*RrRL!5gG+wcRVbD|P`~>qefr!@k89Xp?MS`;Cg@#kUv1gBxSPt=)ygZ;g=+SU=?;zy8o-#b zvB?2~nV47`p_qk>i4}r5L|C{WSU`hA1cDU;1T-MnVSz#b2tPQ#kBNt2J-eXcm5mnn QfqrA~boFyt=akR{09FxaX#fBK literal 0 HcmV?d00001 diff --git a/ui/images/hd/vc_lock_left_bg.png b/ui/images/hd/vc_lock_left_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..539d1e161d3ef4ff3a67b918e1b19d2113cfa884 GIT binary patch literal 2726 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 B|Lp(( literal 0 HcmV?d00001 diff --git a/ui/images/hd/vc_lock_reject_icon.png b/ui/images/hd/vc_lock_reject_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..526b99cec6748d4610a20d85c5815a56db616cb7 GIT binary patch literal 1906 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 literal 0 HcmV?d00001 diff --git a/ui/images/wvga/icon/vc_add_icon.png b/ui/images/wvga/icon/vc_add_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..74cbecda6c500542175fdb406f7411086d7ffc32 GIT binary patch literal 3180 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 N002ovPDHLkV1lDDMh*Y~ literal 0 HcmV?d00001 diff --git a/ui/images/wvga/icon/vc_conference_private.png b/ui/images/wvga/icon/vc_conference_private.png new file mode 100644 index 0000000000000000000000000000000000000000..0b7431d978a8692787b0b087682af3ab3fc79244 GIT binary patch literal 3662 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 literal 0 HcmV?d00001 diff --git a/ui/images/wvga/icon/vc_contact_icon.png b/ui/images/wvga/icon/vc_contact_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..aa21319ec00eab92c5369a87f3179572309e50e4 GIT binary patch literal 3518 zcmV;v4MFmWP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0008%Nkl(le)o8v zyZgQGz26-%GcJRCxFqsGJP;4W1G!l8+X*J3KaTy)hlof5pmtjjfZlC2W`5Cc%(KRJ z1jHh2(C_!Z%4V~3s;VLw3_{m+=(>(ttyUx=m6`83eoL6ya6m5(L1=`ue)bXUH%Nj>qFa0EAr&lF4Kq8iv9BbZ~IMv$L}goCI-n)taB5 zpOYl1Z(KMWMn0dPbM5jQi9{k+V?&`($dw>OG-MdYh}HO$lM{D>1OkCO(P(tsYW(r> zaf*l(*Db#r8yl-^Q`KrU=hWQDj(hfT_FDin8yCdSmb82Y1!2qjRu#?Wsb+=44@7meO@5BSSZI?Vt|g9e#iTwLrN9UZZgDwRsyEm#Z&L{XGC?RJ|*XlZGw1z>0p zAk&+hn=DF=MuP)^z+K@WnM~#x3)afY%3I;izP!Ag6 z(>xIcGBz_a;};DQjYcs!IXNK=q);f_lx10XL0Xa|q*AGrFp$yF(Zryt>&awtTo_0` zpZ_{2kX$bJ#a21W=I7~arfGim`FvMJLYSu6_W67h0KN$UAtEqy62Kz>*9CEW0`P>0 s-rJg+_rrh(;(>S|9*76xfdIb;0MKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0009jNkl6aM`9%=q$9*Hccy9t0g9r+%B}M8k6YUbd>qvZf4G$ncvKv@0>eB zj4?a~33wthK}--6!~}UjF|Cti@un zw2zF8NRdbcZnqn`Tn@Qh4m&$L^+a^S7(3Gakub(89+e#L^?KWr$z(rc?AEceveFO0 zepk->TpLyM_{vQ!BC@Tmtp%s1rb^~06bc9g0-CC-?-^s7UQxigMw;QRKYi(?7ct=M^UsiMS&CN|U5{dlO!?pCZUkN~WHT8># z-V#yXX!d&n;7cWenx=t>jsWD1+BAO6WHQ-uL77bE9KeaLt&yIU{YEbUw3SKq0l=l6 zO(Tys{`BnZ?5fnxbUJ9EaZ*Tv2Gz+U_GFfs?93LMS4G%)s@}yEJ zU#Xa_t*vG~3!$zcL?jYXy(o%rVzHQid3m{H`w@@FpM^r901@>Pkr#knmuq;SYgqxj za=Bdc^z<~%&(EW^wY8#Ls;VN9NMLn!6{@OU0{9Hz*Z-*Ou9lXTw#CIoK~WUgY_@yf z&BMb(%+1YVZ*T7tfbX>gaZF51yiOz%BuV-$D`sbBv9z@G5x{v(KtiEV_wMel{nVFeJ?jVYy zxWHNC+2)lAU>ZDot>R_ZXmH(tj^`)KC>W-A_fNs zC2k;ozu%4;DHsgexPe5Y(R{5y#>U2S+as+u)@)s>ww z<^<3Tz`=>*3P75OesgP4j4bmXq6uPxm>?#I3GxvA82}r;fE3LIxNHCb002ovPDHLk FV1m7KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0006ANklY%vdhG(z*we2nJJFC<9fG3yB)xg4Ma zbbt=f0Xo3{Q|I(X2+=fO15h^3mD@<04tn~1&}o?K19)%2e62N{$N(4svTDvdOf`TSK%$gl z6h++acDxT|Sw>?F`~Ch6fVgaX{0mS6NVL{Wl7tVXq9_>0@o`mS0P+$*HJi=$4+&PL zIF64i8rA{^LGYm{iY8<4NG2p>lHo~wCYd!|(J%}N;Odm=j*F+$=^H6!rJ?rw{m)*n z_X)rcAw+t9B$P;6=W773?6th3lvu4+=ytmSfa}tOdNP^3sGDuESU?DIeT2I}H};4L z0lWs#-)^_R>JrA|v8=2lgTdf=UGj3dd^Q@5KDMn2LWnER^PaXYb;IFM)^%1&VLqR~ zYYC@}F_G{4&CAL$E;;KChr{=({JL1L*Do(I%Vx7lD_vYy46HjfN!bRFq_XZVngDic zHukqux88$t0B>zOu&xfyD~acMznj+Li?>M2P$Z3gOSJ9V=feH^aDWcb0Xjej=l~sH bo&F2}MYq~?(%$!S00000NkvXXu0mjfE+iwe literal 0 HcmV?d00001 diff --git a/ui/images/wvga/icon/vc_icon_conf_call_end.png b/ui/images/wvga/icon/vc_icon_conf_call_end.png new file mode 100644 index 0000000000000000000000000000000000000000..c6ddfea5c43b0a1da1f31be3104f6cf89c0f5c30 GIT binary patch literal 3737 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 literal 0 HcmV?d00001 diff --git a/ui/images/wvga/icon/vc_icon_mute_press.png b/ui/images/wvga/icon/vc_icon_mute_press.png new file mode 100644 index 0000000000000000000000000000000000000000..062056f0ffe3c6955fdb7a05991d7bbd331a1b02 GIT binary patch literal 3553 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 bU|ZuK#JsEf4jN}Q00000NkvXXu0mjfwECw$ literal 0 HcmV?d00001 diff --git a/ui/images/wvga/icon/vc_icon_pause.png b/ui/images/wvga/icon/vc_icon_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..6317e16a1cfc9c7366e226d356ddc11b6908a85d GIT binary patch literal 3153 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 RoHhUe002ovPDHLkV1i*Th{yl{ literal 0 HcmV?d00001 diff --git a/ui/images/wvga/icon/vc_icon_sound_press.png b/ui/images/wvga/icon/vc_icon_sound_press.png new file mode 100644 index 0000000000000000000000000000000000000000..846ac44ee5157cb25371cf2db2176bdfcd51cfd9 GIT binary patch literal 4377 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 T-!30P00000NkvXXu0mjfF1kC0 literal 0 HcmV?d00001 diff --git a/ui/images/wvga/icon/vc_icon_unhold.png b/ui/images/wvga/icon/vc_icon_unhold.png new file mode 100644 index 0000000000000000000000000000000000000000..330c3ed411310de49c68ab4576cf63b0b973be2a GIT binary patch literal 443 zcmV;s0Yv_ZP)YiFcijb#Yki^$P+lp zWH2%D6?g*%AHdZxxG+27j)@Q86R_gy}bp_y~>H_OTJM4wEY36 z^iV}a3vSw2FqA+Gv_K2=KZ4%0t*Df80$?+_xp>kAysbO8vGtu!>8vOU3W8vXVrJXc z%6(6TMwz; lLJ(+y7HEMMXy^JAU;y1LVPcwimQ?@%002ovPDHLkV1nV{$3p-B literal 0 HcmV?d00001 diff --git a/ui/images/wvga/icon/vc_join_icon.png b/ui/images/wvga/icon/vc_join_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fd07d29eaaf8be3407517b76fdabd98642ccdcdf GIT binary patch literal 3541 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 P00000NkvXXu0mjfYgnE) literal 0 HcmV?d00001 diff --git a/ui/images/wvga/icon/vc_join_icon_dim.png b/ui/images/wvga/icon/vc_join_icon_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..fc9fc417e88706f1ca795fc9b43da09a92dace9a GIT binary patch literal 3718 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 literal 0 HcmV?d00001 diff --git a/ui/images/wvga/icon/vc_keypad_icon.png b/ui/images/wvga/icon/vc_keypad_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d43b10ea039c45c4773c11f484fdbf83c115dea5 GIT binary patch literal 3499 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 literal 0 HcmV?d00001 diff --git a/ui/images/wvga/icon/vc_keypad_icon_dim.png b/ui/images/wvga/icon/vc_keypad_icon_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..087565be1ff2c5de176ab77c3b1c9bf12b2617b3 GIT binary patch literal 3545 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 Ef=`89LI3~& literal 0 HcmV?d00001 diff --git a/ui/images/wvga/icon/vc_mute_icon_dim.png b/ui/images/wvga/icon/vc_mute_icon_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..3679bc174776f2aade63fe7d26b61488bb15b9b1 GIT binary patch literal 3538 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%0D2yEn_2Ke3z_%T67 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 M(>Bto*07KHKRYlnEC2ui literal 0 HcmV?d00001 diff --git a/ui/images/wvga/icon/vc_qp_caller_ID.png b/ui/images/wvga/icon/vc_qp_caller_ID.png new file mode 100644 index 0000000000000000000000000000000000000000..fa4f11395f395b07d275823de76c3bfdc57dde23 GIT binary patch literal 2772 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 Hu0mjfIask9 literal 0 HcmV?d00001 diff --git a/ui/images/wvga/icon/vc_rcs_share_icon.png b/ui/images/wvga/icon/vc_rcs_share_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..756347cb3b1d6013e19f600453e75567877a2687 GIT binary patch literal 3580 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 literal 0 HcmV?d00001 diff --git a/ui/images/wvga/icon/vc_record_icon_dim.png b/ui/images/wvga/icon/vc_record_icon_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..032a6af9d11acebd2a2df8a99d6523431cc0ced7 GIT binary patch literal 3228 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 Hu0mjfLQBrJ literal 0 HcmV?d00001 diff --git a/ui/images/wvga/icon/vc_reject_with_msg_header_icon_others.png b/ui/images/wvga/icon/vc_reject_with_msg_header_icon_others.png new file mode 100644 index 0000000000000000000000000000000000000000..4fc9dfa92b33e61e2360138137b741581fad45c0 GIT binary patch literal 2934 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 literal 0 HcmV?d00001 diff --git a/ui/images/wvga/icon/vc_speaker_icon.png b/ui/images/wvga/icon/vc_speaker_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a25ad4a7878f86d14b1f7c95d8715502d5ae3775 GIT binary patch literal 3774 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 literal 0 HcmV?d00001 diff --git a/ui/images/wvga/icon/vc_speaker_icon_dim.png b/ui/images/wvga/icon/vc_speaker_icon_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..3f1a9df52e145dc78353ec86e4b799f303116d67 GIT binary patch literal 3892 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 literal 0 HcmV?d00001 diff --git a/ui/images/wvga/icon/vc_volume_mute_icon.png b/ui/images/wvga/icon/vc_volume_mute_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..62145992b4c55d2727ac4cb8b7b4c436a67adedb GIT binary patch literal 3982 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 literal 0 HcmV?d00001 diff --git a/ui/images/wvga/keypad/vc_keypad_btn_icon.png b/ui/images/wvga/keypad/vc_keypad_btn_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b2396b63be6012c4f354f616b7ed57b0b441d81a GIT binary patch literal 3875 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 QfqrA~boFyt=akR{09FxaX#fBK literal 0 HcmV?d00001 diff --git a/ui/images/wvga/vc_lock_left_bg.png b/ui/images/wvga/vc_lock_left_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..539d1e161d3ef4ff3a67b918e1b19d2113cfa884 GIT binary patch literal 2726 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 B|Lp(( literal 0 HcmV?d00001 diff --git a/ui/images/wvga/vc_lock_reject_icon.png b/ui/images/wvga/vc_lock_reject_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..526b99cec6748d4610a20d85c5815a56db616cb7 GIT binary patch literal 1906 zcmV-&2aWiNP)$;nEeV4^A^TK^&`b ziyus=A7cp72UC-TBM87VTE>`Xal7aCX4aNyTJqwymeyGAFLo0V+o1uK|j*eG;v#pq8thGMC! zt2^&@yRDZlU9!OYV`F1;XV0GX+`4sZnPG17wZID_7bkt5_dsGp!;3~Q8bVc7)zrYi z!0OJ<&c7l-78e))tgWprVfY^6wWJ*wB(OT}0gR%eqVY$M9z|AGR{jxn$nNg$VRLhH z-H8H&q(Z(rMn*>d5E%qkR99Em-HZn#2U1^O|4Q%b(2};cwr?{Mj9EbBGBh;wEMvf6 z8)7OD1)O>CWN8ZqdzpY_L(B#umuNH^_xXIzv;%|P?y;A7`SRtKm;wQJJ~}%3ep-OR z(P;-j0kRh;R;TdayW|DwiyOR>*i=l)$s!k*xk56)#C#bY5NdqH?qL$>b-d&XYe8V`;l+vCg z6%1!6U<2%m6L&#YO$oLo)wvQ+C~7tU>My_OoFk+Jn+h-%PEcUU7biM-o6Yt_%O0Uo z&6u-s2XpLw3_=McGK{iwYfO+rwCI^5Szvq+rx@@)TQqlA#m)${YGXDS$c}~X?(QW6 zs>5@B$M6*L;$o z@Bjn#S%IO*6i8<%JizoqeU`!dWSwL%$E$_X;BIL}v*`{-Pq)Jjv|4O=d3on3Vx7Ba zOlNYpgVv^g1rEnQpaAm}jWQEA_#HUNd{5T#Aju3GF}Nw{x?)B)_0MR0?mFda*+!$z z1Q@XOavgU&*pPR$T)TG7T3A?kPU?7&8cduS1XZEYhJIAZ8e znGfCJtp64%FN3WYh@og~9i039`}b!Nyc;}?ZzE;sFPPBv5Qa$GKwkD{qyO>a$Drai zqhR1p36zzyVv%p>!|{$KhXU9enVg)A`~Ch8jezmMouc^87T!=a;-&}=9;;}W>b_ZKs);T`&*TB zuC1-j(17XH>jjYOoK4hwLg|47m$6Tqbth91W zioe!blW`Oj6ezQI)z8(`)HH-bp)VB2>d~=QigWvQY;0_skTess>wwW@Es>2#aQ6g) zF=UEM^sXF$K=6VAHC6I*v@ZdQWi7AeG2z&B!U`Vlzc;V1uj9|PB0hfzl^qESedf?zJo)oXSbye`7|DLwXk~M$1dGqEAMN~V-GmDnP0Ve}l zJWYW2KWT4o&xii|Wb9Gf?e-Re%XagIBh`EeY80Z{iG*hiAty1r5Dq7-jDDAvmR=c| zlLV)!scAx`=HsOT1Jc^s`iYK$v|BV-lPN1JYgSG=K0e;V8xEnQ5@FudfAHYJXJ&7k zfUW84>zgy02kC*M%#jTB$8>gfer48bkp`%4EEfA)`33NNBTJyUsX*f5Mp?pX~C(@z*cWC~$F`b?Cud0JB@CMIexU%uR% zlauo<>3u;E;8Q$1(S@bGocBkmzcbzY`u%gx`JU(dJm2r<{XF02oXisrBn4S@Spa|n z`Pfls01!m@IUYj7*IhNuU*MY>)5eqO!k{suspkR#A%Ni*h#`kkg94ocsR8HD_6J%3 z01?SY39d2EKTHlWyhk;Am-@<@m;L&1W%qKdx8)ZVG?|e3X(*@y^ZVW%$Bu&=qI5Ss z*J_^?tLhedt6z7Ovy&IJL+0p3U2fMNVz81vN_)4%tohwH?b*Jw!qSNN21^AWjGKZ| z#{#M4Zr?>ek!S3RclosC$X^>z?l-QQm6H=bxokAu9#6Ot)Sd9rC^Qib+Fj;etVG1W zwaH`7_7r}-^#T00i8_Tm9>-e}AwI5;UMto=oP3zP5xS~&1gflAdE8G`xcOQ#=?U_b z^MKp1bgp7eZ@x5N2x&zdiC+#>1{Zu6?m|$EpySHbpX$+;qc88OCf~peGO`Bz1+O!! zyoLm!^l}hRGU>t^yKr(^FuN$#h$7i8ze@ps++MiQ66N^Rm0FGP3}I0NdPh6ywlq*A z*L79F)Qm*yMZc&xG$7yUr={P>t@h2ic9Kd#Cf~#8+c;m}V{dFM-RX@|(ZaQIzvr4g z4f{jwGJ?{e1i#2|ZIo1O*FanZ|rOYEp`K2_z#t<%w3txF7LZrcmc;RJvIxI$u4HIlVo55MZA} zKlbBDiBs;k9%|qaSXEYHbdy&kVHHnWl7>grO973{w?akshfG)6euSr7mtVmAg&>J0 zEM%>*D=(@=y(uX6UnYf0$vv3tbgpPRr@Ftt7U(0X8-L;rdpp3+tce$0fl!3%YF*vZdX(~TIcW|+h0OnJ$x9?G_=Yn5eAVpt$bPgdYrJby; z?G`n=qmBVj`7URhn%4IjjwV8wt`XGzV6cd}8f1T`Si(@1wf@~{bkoe1GCd@WrCX=p zkiOyS)4JdfYkPvpMsh`ORR1A%CM;(#+o~5%XC<3IkzbW~;HqtNZsjUMDA$!Al5*!F zUQ!e=09#rV`5T&XZPHMp>@-TEory}f&p$w4$SeMIxvsiP0Qjn`yxI#cze@6fhrVZU zY1*0=y-s2vkEAvkL=l=6mUb(+s}>AYB%{-p*Pf~spl^l z5~roc-*A_cnyOfKP^TYiiaGx7;*M7LA~9~n__%bZGb-#g`|;eLf*hu(A#36nX}EGG zIX!}&qyW3&hIhyT$&}b5tA!KFzX~`bnjO(nASxwXi;*_-HHPrt&%<(dw<2xnKp4!@ zSo?T(eD5q#cc?=nBOL-&DUTb89sZ?;c5jl*Y85%CWFBT^Y}vi2MK@;DXEMS^;wDR+ zmL31>UUa{t5`U%`V3k>dulv{?mhIs>Zm}X;hy<|PS*H)!jgYy|%+z=YiawO};uWV& zIdSb>n}EY!OaRyssL_`0ZPHdomJ8bEwHw3{JhKJbi3Rg_Hl?7FuVV`Cmg7Y&GHst5 zlzY%dY2$#R16gh~b}fp}>JPO&+NS`YJ7JuK$2=o9{ntH`nYb(2v$p<9* z)VpwZNz|rDT{a`F!P}$dAw~gM6ZVB#B~3)4>zfY=4-Wi{;(43cL7yej4NLt-WZ=eB z5S#NknjJnraWmhsush@*Ew3DT&0-{DQKr)qmFPe6npsyDaj8;_fEk{u#2fxl*-rmt z-~emILXBlsUm1%leFu9&O6{aOPoQGo+vs^mvcvl~&2CmBtx5BhSv@DyX4YQWh-zIV z099Dd!~5)KQx?1HZw`A9kIMiYyixSr0=#H^vHfOTH?P{A1tHLXfh{7KEoPvB8|96G4xO?7!2UtNM2WoQkoO$vne#whJAo z$`R>tBihS^7*m)3C(L;`IdV2EZ#tj=2~+s+A4|m&orXtxqWWd=0dR`VmxRnTFDGX$ z;9ynGC#yR!I$6$0?1+isT zQQz*55s162YDjL7QHR5wV)htGe zvL9kR!}qIjjU4(O&X1cvL?>Ujg$s?j>{Q&`=nvPOH6iAGRc6xqs$+!Rn5j7jnS90e z?e(44!`)iOII~+N9z0B`@JQ`rM)7K;xZ_Yy)t2PLC)PH^8#^oU^gTXeel1!&zb8wv z(;ZdwmvR)1o8)^^fbdX$@#*!VY#FrkS%bZY*o58DFzzG?zi z4ZloQl`A#ZmSy-J-mv)h<^u%iWgMDyI_a16Q40{V_I_K36mU=B8+F*NxjpL6gTETT kq1GGANsv^NR=hzcK=1cWZ>?~ugMT>y*~Z~$J&}^~Kk{(pD*ylh literal 0 HcmV?d00001 diff --git a/ui/org.tizen.call.desktop.in b/ui/org.tizen.call.desktop.in new file mode 100755 index 0000000..b2f7cf7 --- /dev/null +++ b/ui/org.tizen.call.desktop.in @@ -0,0 +1,10 @@ +Name=Call +Type=Application +Exec=${PREFIX}/bin/voice-call-ui +MimeType=tel.uri +nodisplay=True +Version=0.2.0 +X-Tizen-TaskManage=False +X-Tizen-Multiple=False +X-Tizen-Removable=False +X-Tizen-Svc=http://tizen.org/appsvc/operation/call|tel|NULL diff --git a/ui/po/CMakeLists.txt b/ui/po/CMakeLists.txt new file mode 100755 index 0000000..914608f --- /dev/null +++ b/ui/po/CMakeLists.txt @@ -0,0 +1,25 @@ +# for i18n + +SET(POFILES de_DE.po el_GR.po en.po es_ES.po fr_FR.po it_IT.po ja_JP.po +ko_KR.po nl_NL.po pt_PT.po ru_RU.po tr_TR.po zh_CN.po zh_HK.po zh_TW.po ) + +SET(MSGFMT "/usr/bin/msgfmt") + +FOREACH(pofile ${POFILES}) + SET(pofile ${CMAKE_CURRENT_SOURCE_DIR}/${pofile}) + MESSAGE("PO: ${pofile}") + GET_FILENAME_COMPONENT(absPofile ${pofile} ABSOLUTE) + GET_FILENAME_COMPONENT(lang ${absPofile} NAME_WE) + SET(moFile ${CMAKE_CURRENT_BINARY_DIR}/${lang}.mo) + ADD_CUSTOM_COMMAND( + OUTPUT ${moFile} + COMMAND ${MSGFMT} -o ${moFile} ${absPofile} + DEPENDS ${absPofile} + ) + INSTALL(FILES ${moFile} + DESTINATION ${LOCALEDIR}/${lang}/LC_MESSAGES RENAME ${PROJECT_NAME}.mo) + SET(moFiles ${moFiles} ${moFile}) +ENDFOREACH(pofile) + +MESSAGE(".mo files: ${moFiles}") +ADD_CUSTOM_TARGET(po ALL DEPENDS ${moFiles}) diff --git a/ui/po/de_DE.po b/ui/po/de_DE.po new file mode 100755 index 0000000..619d86e --- /dev/null +++ b/ui/po/de_DE.po @@ -0,0 +1,333 @@ +msgid "IDS_CALL_HEADER_CREATE_REJECT_MESSAGE" +msgstr "Ablehnungsnachricht erstellen" + +msgid "IDS_CALL_POP_REJECT_MESSAGE_LIST_IS_EMPTY" +msgstr "Liste der Ablehnungs-Nachrichten ist leer" + +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Ablehnen und Mitteilung senden" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Anruf" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Teiln. nicht erreich." + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Anruf beendet" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Anruf abgelehnt" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Getrennt" + +msgid "IDS_CALL_BODY_INVALID_NUMBER" +msgstr "Ungültige Nummer" + +msgid "IDS_CALL_BODY_IN_CALL" +msgstr "Im Anruf" + +msgid "IDS_CALL_BODY_MPTY" +msgstr "Konferenz" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Antwortet nicht" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Nummer gewechselt" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Nummer nicht vorhanden" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Gehalten" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Teilnehmer" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Annehmen" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Anruf hin." + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Kontakte" + +msgid "IDS_CALL_BUTTON_END_M_CALL_BUTTON" +msgstr "Beenden" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Headset" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Halten" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Konferenz" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Stumm" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Abweisen" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Lautsp." + +msgid "IDS_CALL_BUTTON_SPLIT" +msgstr "Teilen" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Abrufen" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Konferenz" + +msgid "IDS_CALL_OPT_END_CURRENT_CALL_N_ANSWER" +msgstr "Aktuellen Anruf beenden und antworten" + +msgid "IDS_CALL_OPT_HOLD_CURRENT_CALL_N_ANSWER" +msgstr "Aktuellen Anruf halten und antworten" + +msgid "IDS_CALL_OPT_PRIVATE" +msgstr "Privat" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Systemfehler" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Alle eingehenden Anrufe gesperrt" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Alle ausgehenden Anrufe gesperrt" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Anruf fehlgeschlagen" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Nur Notrufe" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Anruf unzulässig" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Anruf gesperrt" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Umleitung aktiv: Immer" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Umleitung aktiv: Immer" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Umleitung aktiv: Nicht erreichbar" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Umleitung aktiv: Bei besetzt" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Anruf weitergeleitet" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Falsche Nummer" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Wechseln Sie vom Offline-Profil zu einem anderen Profil, um Netzdienste nutzen zu können" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Wählen ..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Sendevorgang fehlgeschlagen. Erneut versuchen" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Notruf" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Nur FDN-Anrufe" + +msgid "IDS_CALL_POP_HELD" +msgstr "Gehalten" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Halten fehlgeschlagen" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Halten nicht unterstützt" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Eingehende Anrufe bei Roaming gesperrt" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Unvollständig" + +msgid "IDS_CALL_POP_JOINED" +msgstr "Konferenz" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Konferenz fehlgeschlagen" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Konferenz nicht unterstützt" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Netz besetzt" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Netzwerk nicht verfügbar" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Kein Guthaben übrig" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Kein Netz" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Betrieb abgelehnt" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Ausgehende internationale Anrufe außer Daheim gesperrt" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Ausgehende internationale Anrufe gesperrt" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefon nicht initialisiert" + +msgid "IDS_CALL_POP_PS_REJECTED" +msgstr "4422341526 abgelehnt" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Wahlwiederholung..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Dienst unzulässig" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Nur SOS-Anruf. SIM-Karte einsetzen, um Netzdienste zu nutzen" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Teilen fehlgeschlagen" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Teilen nicht unterstützt" + +msgid "IDS_CALL_POP_SWAPPED" +msgstr "Getauscht" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Tauschen fehlgeschlagen" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Tauschen nicht unterstützt" + +msgid "IDS_CALL_POP_SWITCHED_TO_BT_HEADSET" +msgstr "Zu BT-Headset gewechselt" + +msgid "IDS_CALL_POP_SWITCHED_TO_PHONE" +msgstr "Zu Telefon gewechselt" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Übertragungsfehler" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Übertragen nicht unterstützt" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Kann nicht abgerufen werden" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Nicht verfügbar" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Übernommen" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Nicht halten nicht unterstützt" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Besetzt" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "SIM verifizieren oder gültige SIM eingeben" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Sprachanruf ist während Videoanruf nicht zugelassen" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Warten aktiv" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Falsche Gruppe" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Anruf mit Nachricht abweisen" + +msgid "IDS_CALL_POP_END_ACTIVE_CALL" +msgstr "Aktives Gespräch beenden" + +msgid "IDS_CALL_OPT_HOLDCALL" +msgstr "Anruf halten" + +msgid "IDS_CALL_OPT_END_HELD_CALL" +msgstr "Gehaltenes Gespräch beenden" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Alle Anrufe beenden" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Aktive Anrufe beenden (%d)" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Gehaltene Anrufe beenden (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Kopfhörer" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Empfänger" + +msgid "IDS_CALL_BODY_FAILED_TO_REGISTER_ACCOUNT" +msgstr "Konto konnte nicht registriert werden." + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Aktiven Anruf halten" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Nicht genügend Speicher. Löschen Sie einige Elemente" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Beenden" + +msgid "IDS_MSGC_OPT_SOUND" +msgstr "Ton" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Service nicht verfügbar" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Tasten-\nfeld" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Verbindung wird hergestellt..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Abgewiesen" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Sendevorgang läuft..." + +msgid "IDS_CALL_BUTTON2_HIDE_KEYPAD" +msgstr "Tastatur ausbl." + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Rec" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Unbekannten Anruf abgewiesen" + +msgid "IDS_CALL_POP_SAVED" +msgstr "Gespeichert" + diff --git a/ui/po/el_GR.po b/ui/po/el_GR.po new file mode 100755 index 0000000..4923d0b --- /dev/null +++ b/ui/po/el_GR.po @@ -0,0 +1,333 @@ +msgid "IDS_CALL_HEADER_CREATE_REJECT_MESSAGE" +msgstr "Δημιουργία μηνύματος απόρριψης" + +msgid "IDS_CALL_POP_REJECT_MESSAGE_LIST_IS_EMPTY" +msgstr "Η λίστα μηνυμάτων απόρριψης είναι κενά" + +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Απόρριψη με μήνυμα" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Κλήση" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Ο καλ.δεν είναι διαθ." + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Τέλος κλήσης" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Απόρριψη κλήσης" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Αποσυνδέθηκε" + +msgid "IDS_CALL_BODY_INVALID_NUMBER" +msgstr "Μη έγκυρος αριθμός" + +msgid "IDS_CALL_BODY_IN_CALL" +msgstr "Σε κλήση" + +msgid "IDS_CALL_BODY_MPTY" +msgstr "Συνδιάσκεψη" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Δεν απαντά" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Ο αριθμός άλλαξε" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Δεν υπάρχει ο αριθμός." + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Αναμονή" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "People" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Αποδοχή" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Πρ. κλήσ." + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Επαφές" + +msgid "IDS_CALL_BUTTON_END_M_CALL_BUTTON" +msgstr "Λήξη" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Ακουστικά" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Αναμονή" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Ένωση" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Σίγαση" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Απόρριψη" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Ηχείο" + +msgid "IDS_CALL_BUTTON_SPLIT" +msgstr "Διαχωρ." + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Απελευθ." + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Τηλεφωνική συνδιάσκεψη" + +msgid "IDS_CALL_OPT_END_CURRENT_CALL_N_ANSWER" +msgstr "Τερματισμός τρέχουσας κλήσης και απάντηση" + +msgid "IDS_CALL_OPT_HOLD_CURRENT_CALL_N_ANSWER" +msgstr "Αναμονή τρέχουσας κλήσης και απάντηση" + +msgid "IDS_CALL_OPT_PRIVATE" +msgstr "Προσωπικό" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Σφάλμα συστήματος" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Φραγή όλων των εισερχόμενων κλήσεων" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Φραγή όλων των εξερχόμενων κλήσεων" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Αποτυχία κλήσης" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Μόνο επείγουσες κλήσεις" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Μη επιτρεπτή κλήση" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Φραγή κλήσης" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Ενεργή Προώθηση Κλήσεων: Πάντα" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Προώθηση κλήσεων ενεργή: Εάν δεν απαντά" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Προώθηση κλήσεων ενεργή: Aδύνατη πρόσβαση" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Προώθηση κλήσεων ενεργή: Σε κατειλημμένη γραμμή" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Έγινε προώθηση κλήσης" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Λάθος αριθμός" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Αλλαγή από προφίλ χωρίς σύνδεση σε άλλο προφίλ για υπηρεσίες δικτύου" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Κλήση..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Αποτυχία αποστολής. Επανάληψη" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Κλήση έκτακτης ανάγκης" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Μόνο κλήσεις FDN" + +msgid "IDS_CALL_POP_HELD" +msgstr "Αναμονή" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Αποτυχία αναμονής" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Η αναμονή δεν υποστηρίζεται" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Φραγή εισερχομένων σε περιαγωγή" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Δεν ολοκληρώθηκε" + +msgid "IDS_CALL_POP_JOINED" +msgstr "Ενώθηκε" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Αποτυχία ένωσης" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Η ένωση δεν υποστηρίζεται" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Κατειλημμένο δίκτυο" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Δίκτυο μη διαθέσιμο" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Εξάντληση μονάδων" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Μη διαθέσιμη υπηρεσία" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Η λειτουργία απορρίφθηκε" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Φραγή εξερχομένων διεθνών εκτός χώρας επιλογής" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Φραγή όλων των\nεξερχόμενων διεθνών κλήσεων" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Το τηλέφωνο δεν ξεκίνησε" + +msgid "IDS_CALL_POP_PS_REJECTED" +msgstr "4422341526 απορρίφθηκε" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Επανάκληση..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Δεν επιτρέπεται η υπηρεσία" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Μόνο κλήση SOS. Τοποθετήστε την κάρτα SIM για πρόσβαση στις υπηρεσίες δικτύου" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Αποτυχία διαχωρισμού" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Ο διαχωρισμός δεν υποστηρίζεται" + +msgid "IDS_CALL_POP_SWAPPED" +msgstr "Εναλλαγή" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Αποτυχία εναλλαγής" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Η εναλλαγή δεν υποστηρίζεται" + +msgid "IDS_CALL_POP_SWITCHED_TO_BT_HEADSET" +msgstr "Έγινε αλλαγή σε ακουστικά BT" + +msgid "IDS_CALL_POP_SWITCHED_TO_PHONE" +msgstr "Αλλαγή σε τηλέφωνο" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Σφάλμα μεταφοράς" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Η μεταφορά δεν υποστηρίζεται" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Δεν είναι δυνατή η ανάκτηση" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Μη διαθέσιμο" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Απενεργοποίηση αναμονής" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Η κατάργηση αναμονής δεν υποστηρίζεται" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Κατειλημμένη γραμμή" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Επαληθεύστε SIM ή εισάγετε έγκυρη SIM" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Δεν επιτρέπεται φωνητική κλήση κατά τη διάρκεια κλήσης βίντεο" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Αναμονή ενεργή" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Λάθος ομάδα" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Απόρριψη κλήσης με μήνυμα" + +msgid "IDS_CALL_POP_END_ACTIVE_CALL" +msgstr "Τερματισμός ενεργής κλήσης" + +msgid "IDS_CALL_OPT_HOLDCALL" +msgstr "Κλήση σε αναμονή" + +msgid "IDS_CALL_OPT_END_HELD_CALL" +msgstr "Λήξη κλήσης σε αναμονή" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Τερματ. όλων κλήσεων" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Τερματισμός ενεργών κλήσεων (%d)" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Τερματισμός κλήσεων σε αναμονή (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Ακουστικά" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Δέκτης" + +msgid "IDS_CALL_BODY_FAILED_TO_REGISTER_ACCOUNT" +msgstr "Αποτυχία καταχώρισης λογαριασμού" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Ενερ. κλήση σε κράτ." + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Δεν υπάρχει αρκετή μνήμη. Διαγράψτε ορισμένα στοιχεία" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Τερμ.κλ." + +msgid "IDS_MSGC_OPT_SOUND" +msgstr "Ήχος" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Μη διαθέσιμη λειτουργία" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Πληκτρολ." + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Σύνδεση..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Απόρριψη" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Αποστολή..." + +msgid "IDS_CALL_BUTTON2_HIDE_KEYPAD" +msgstr "Απόκρ. πληκτρ." + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Εγγρ." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Άγνωστη κλήση απορρίφθηκε" + +msgid "IDS_CALL_POP_SAVED" +msgstr "Αποθηκεύτηκε" + diff --git a/ui/po/en.po b/ui/po/en.po new file mode 100755 index 0000000..c0c7a85 --- /dev/null +++ b/ui/po/en.po @@ -0,0 +1,333 @@ +msgid "IDS_CALL_HEADER_CREATE_REJECT_MESSAGE" +msgstr "Create reject message" + +msgid "IDS_CALL_POP_REJECT_MESSAGE_LIST_IS_EMPTY" +msgstr "Reject message list is empty" + +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Reject with message" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Call" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Called party not available" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Call ended" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Call rejected" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Disconnected" + +msgid "IDS_CALL_BODY_INVALID_NUMBER" +msgstr "Invalid number" + +msgid "IDS_CALL_BODY_IN_CALL" +msgstr "In call" + +msgid "IDS_CALL_BODY_MPTY" +msgstr "Multiparty" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "No answer" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Number changed" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Number does not exist" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "On hold" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "People" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Accept" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Add call" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Contacts" + +msgid "IDS_CALL_BUTTON_END_M_CALL_BUTTON" +msgstr "End" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Headset" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Hold" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Join" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Mute" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Reject" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Speaker" + +msgid "IDS_CALL_BUTTON_SPLIT" +msgstr "Split" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Unhold" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Conference call" + +msgid "IDS_CALL_OPT_END_CURRENT_CALL_N_ANSWER" +msgstr "End current call & answer" + +msgid "IDS_CALL_OPT_HOLD_CURRENT_CALL_N_ANSWER" +msgstr "Hold current call & answer" + +msgid "IDS_CALL_OPT_PRIVATE" +msgstr "Private" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "System error" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "All incoming calls barred" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "All outgoing calls barred" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Call failed" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Emergency calls only" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Call not allowed" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Call barred" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Divert calls: Always" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Divert calls: No answer" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Divert calls: Unreachable" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Divert calls: When busy" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Call diverted" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Wrong number" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Change from Offline to other profile for network services" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Dialling..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Sending failed. Try again" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Emergency call" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "FDN calls only" + +msgid "IDS_CALL_POP_HELD" +msgstr "Held" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Hold failed" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Hold not supported" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Incoming calls barred when roaming" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Incomplete" + +msgid "IDS_CALL_POP_JOINED" +msgstr "Joined" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Join failed" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Join not supported" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Network busy" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Network not available" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "No credit left" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "No service" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operation refused" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Outgoing international calls except home barred" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Outgoing international calls barred" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Phone not initialised" + +msgid "IDS_CALL_POP_PS_REJECTED" +msgstr "%s rejected" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Redialling..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Service not allowed" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "SOS call only. Insert SIM card to access network services" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Split failed" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Split not supported" + +msgid "IDS_CALL_POP_SWAPPED" +msgstr "Swapped" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Swap failed" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Swap not supported" + +msgid "IDS_CALL_POP_SWITCHED_TO_BT_HEADSET" +msgstr "Switched to BT headset" + +msgid "IDS_CALL_POP_SWITCHED_TO_PHONE" +msgstr "Switched to phone" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Transfer failed" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Transfer not supported" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Unable to retrieve" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Unavailable" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Unheld" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Unhold not supported" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "User busy" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Verify SIM or insert valid SIM" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Voice call is not allowed during video call" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Waiting active" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Wrong group" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Reject call with message" + +msgid "IDS_CALL_POP_END_ACTIVE_CALL" +msgstr "End active call" + +msgid "IDS_CALL_OPT_HOLDCALL" +msgstr "Hold call" + +msgid "IDS_CALL_OPT_END_HELD_CALL" +msgstr "End held call" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "End all calls" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "End active calls (%d)" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "End held calls (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Headphones" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Receiver" + +msgid "IDS_CALL_BODY_FAILED_TO_REGISTER_ACCOUNT" +msgstr "Failed to register account" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Hold active call" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Not enough memory. Delete some items" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "End call" + +msgid "IDS_MSGC_OPT_SOUND" +msgstr "Sound" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Service not available" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Keypad" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Connecting..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Rejected" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Sending..." + +msgid "IDS_CALL_BUTTON2_HIDE_KEYPAD" +msgstr "Hide keypad" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "REC" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Unknown call rejected" + +msgid "IDS_CALL_POP_SAVED" +msgstr "Saved" + diff --git a/ui/po/es_ES.po b/ui/po/es_ES.po new file mode 100755 index 0000000..15ca367 --- /dev/null +++ b/ui/po/es_ES.po @@ -0,0 +1,333 @@ +msgid "IDS_CALL_HEADER_CREATE_REJECT_MESSAGE" +msgstr "Crear mensaje para rechazar" + +msgid "IDS_CALL_POP_REJECT_MESSAGE_LIST_IS_EMPTY" +msgstr "Lista de mensajes rechazados vacía" + +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Rechazar con mensaje" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Llamadas" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Destinatario ocupado" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Llamada finalizada" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Llamada rechazada" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Desconectado" + +msgid "IDS_CALL_BODY_INVALID_NUMBER" +msgstr "Número no válido" + +msgid "IDS_CALL_BODY_IN_CALL" +msgstr "En llamada" + +msgid "IDS_CALL_BODY_MPTY" +msgstr "Multiconferencia" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Sin respuesta" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Número cambiado" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "No hay número" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "En espera" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Gente" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Aceptar" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Añadir llamada" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Contactos" + +msgid "IDS_CALL_BUTTON_END_M_CALL_BUTTON" +msgstr "Finalizar" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Auricul" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Retener" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Enlazar" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Silencio" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Rechazar" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Altavoz" + +msgid "IDS_CALL_BUTTON_SPLIT" +msgstr "Dividir" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Canc. ret." + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Multiconferencia" + +msgid "IDS_CALL_OPT_END_CURRENT_CALL_N_ANSWER" +msgstr "Finalizar llamada actual y responder" + +msgid "IDS_CALL_OPT_HOLD_CURRENT_CALL_N_ANSWER" +msgstr "Mantener llamada actual en espera y responder" + +msgid "IDS_CALL_OPT_PRIVATE" +msgstr "Particular" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Error del sistema" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Restringidas todas las llamadas entrantes" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Restringidas todas las llamadas salientes" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Error al llamar" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Sólo llamadas de emergencia" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Llamada no permitida" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Llamada restringida" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Desvío de llamadas: Siempre" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Desvío de llamadas: Sin respuesta" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Desvío de llamada: Si no localizable" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Desvío de llamada: Si ocupado" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Llamada reenviada" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Número erróneo" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Cambiar de Fuera de línea a otro perfil de servicios de red" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Marcando..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Error al enviar. Inténtelo de nuevo" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Llamada de emergencia" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Sólo llamadas FDN" + +msgid "IDS_CALL_POP_HELD" +msgstr "Espera" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Error de espera" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Espera no admitida" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Llamadas entrantes restringidas en el extranjero" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Incompleto" + +msgid "IDS_CALL_POP_JOINED" +msgstr "Enlazada" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Error de enlace" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Enlace no admitido" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Red ocupada" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Red no disponible" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "No queda saldo" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Sin servicio" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operación rechazada" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Llamadas internacionales salientes excepto país de origen restringidas" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Llamadas salientes internacionales restringidas" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Teléfono no iniciado" + +msgid "IDS_CALL_POP_PS_REJECTED" +msgstr "4422341526 rechazado" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Marcando nuevamente..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Servicio no permitido" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Sólo llamadas de emergencia. Inserte tarjeta SIM para acceder a los servicios de red" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Error al dividir" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "División no admitida" + +msgid "IDS_CALL_POP_SWAPPED" +msgstr "Cambiada" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Error al cambiar" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Cambio no admitido" + +msgid "IDS_CALL_POP_SWITCHED_TO_BT_HEADSET" +msgstr "Cambiado a auricular BT" + +msgid "IDS_CALL_POP_SWITCHED_TO_PHONE" +msgstr "Cambiado a teléfono" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Error de transferencia" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Transferencia no admitida" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "No se puede recuperar" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "No disponible" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Desactivar en espera" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Desactivación de espera no admitida" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Usuario ocupado" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Compruebe SIM o inserte SIM válida" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "No se permite realizar llamadas de voz durante una llamada de vídeo" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Espera activa" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Grupo erróneo" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Rechazar llamada con mensaje" + +msgid "IDS_CALL_POP_END_ACTIVE_CALL" +msgstr "Finalizar llamada activa" + +msgid "IDS_CALL_OPT_HOLDCALL" +msgstr "Retener llamada" + +msgid "IDS_CALL_OPT_END_HELD_CALL" +msgstr "Finalizar llamada en espera" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Fin todas llamadas" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Finalizar llamadas activas (%d)" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Finalizar llamadas retenidas (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Auriculares" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Receptor" + +msgid "IDS_CALL_BODY_FAILED_TO_REGISTER_ACCOUNT" +msgstr "Error al registrar la cuenta" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Poner llam act esper" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "No hay memoria suficiente. Elimine algunos elementos" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Fin llam" + +msgid "IDS_MSGC_OPT_SOUND" +msgstr "Sonido" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Servicio no disponible" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Teclado" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Conectando..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Rechazado" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Enviando..." + +msgid "IDS_CALL_BUTTON2_HIDE_KEYPAD" +msgstr "Ocultar teclado" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "REC" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Llamada desconocida rechazada" + +msgid "IDS_CALL_POP_SAVED" +msgstr "Guardado" + diff --git a/ui/po/fr_FR.po b/ui/po/fr_FR.po new file mode 100755 index 0000000..0316cf0 --- /dev/null +++ b/ui/po/fr_FR.po @@ -0,0 +1,333 @@ +msgid "IDS_CALL_HEADER_CREATE_REJECT_MESSAGE" +msgstr "Créer un message de rejet" + +msgid "IDS_CALL_POP_REJECT_MESSAGE_LIST_IS_EMPTY" +msgstr "La liste des messages de rejet est vide" + +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Refus avec message" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Appels" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Contact indisponible" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Fin d'appel" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Appel refusé" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Déconnecté" + +msgid "IDS_CALL_BODY_INVALID_NUMBER" +msgstr "Numéro non valide" + +msgid "IDS_CALL_BODY_IN_CALL" +msgstr "Appel" + +msgid "IDS_CALL_BODY_MPTY" +msgstr "Conférence" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Aucune réponse" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Numéro modifié" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Le numéro n'existe pas." + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Attente" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Personnes" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Accepter" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Ajouter" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Contacts" + +msgid "IDS_CALL_BUTTON_END_M_CALL_BUTTON" +msgstr "Fin" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Casque" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Attente" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Rejoindre" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Muet" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Refuser" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "HP" + +msgid "IDS_CALL_BUTTON_SPLIT" +msgstr "Isoler" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Récup." + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Conférence téléphonique" + +msgid "IDS_CALL_OPT_END_CURRENT_CALL_N_ANSWER" +msgstr "Mettre fin à l'appel en cours et répondre" + +msgid "IDS_CALL_OPT_HOLD_CURRENT_CALL_N_ANSWER" +msgstr "Mettre l'appel en cours en attente et répondre" + +msgid "IDS_CALL_OPT_PRIVATE" +msgstr "Confidentiel" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Erreur système" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Tous appels entrants interdits" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Tous appels sortants interdits" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Echec de l'appel" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Appels d'urgence uniquement" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Appel non autorisé" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Appel interdit" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Renvoi d'appel activé : Toujours" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Renvoi d'appel activé : Aucune réponse" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Renvoi d'appel activé : Injoignable" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Renvoi d'appel activé : Occupé" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Appel transféré" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Numéro incorrect" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Quittez le profil hors-ligne pour les services radio" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Composition..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Echec de l'envoi. Réessayez ultérieurement" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Appel d'urgence" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Appels FDN uniquement" + +msgid "IDS_CALL_POP_HELD" +msgstr "En attente" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Échec de mise en attente" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Mise en attente non supportée" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Appels entrants interdits en itinérance" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Non terminé" + +msgid "IDS_CALL_POP_JOINED" +msgstr "Ajouté" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Échec conférence" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Conférence non supportée" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Réseau occupé" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Réseau non disponible" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Crédit épuisé" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Aucun service" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Opération refusée" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Appels internationaux sortants interdits sauf vers pays d'origine" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Appels internationaux sortants interdits" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Téléphone non initialisé" + +msgid "IDS_CALL_POP_PS_REJECTED" +msgstr "4422341526 refusé" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Rappel..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Service non autorisé" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Appel d'urgence uniquement. Insérez la carte SIM pour accéder aux services réseau" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Échec appel isolé" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Appel isolé non supporté" + +msgid "IDS_CALL_POP_SWAPPED" +msgstr "Permuté" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Échec permut." + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Permutation non supportée" + +msgid "IDS_CALL_POP_SWITCHED_TO_BT_HEADSET" +msgstr "Basculer sur le casque Bluetooth" + +msgid "IDS_CALL_POP_SWITCHED_TO_PHONE" +msgstr "Basculer sur le téléphone" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Erreur de transfert" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Transfert non supporté" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Récupération impossible" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Non disponible" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Récupération" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Récupération non supportée" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Occupé" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Vérifiez la carte SIM ou insérez-en une valide" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Appel vocal non autorisé pendant un appel visio" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "En attente" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Groupe incorrect" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Rejeter l'appel avec message" + +msgid "IDS_CALL_POP_END_ACTIVE_CALL" +msgstr "Terminer l'appel en cours" + +msgid "IDS_CALL_OPT_HOLDCALL" +msgstr "Mettre l'appel en attente" + +msgid "IDS_CALL_OPT_END_HELD_CALL" +msgstr "Terminer l'appel en attente" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Terminer tous les appels" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Terminer appels actifs (%d)" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Terminer appels en attente (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Ecouteurs" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Destinataire" + +msgid "IDS_CALL_BODY_FAILED_TO_REGISTER_ACCOUNT" +msgstr "Impossible d'enregistrer le compte" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Mettre en attente" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Mémoire insuffisante. Supprimez certains éléments" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Fin" + +msgid "IDS_MSGC_OPT_SOUND" +msgstr "Son" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Service non disponible" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Clavier" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Connexion ..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Rejeté" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Envoi ..." + +msgid "IDS_CALL_BUTTON2_HIDE_KEYPAD" +msgstr "Masquer clavier" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "ENREG" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Appelant inconnu\nrefusé" + +msgid "IDS_CALL_POP_SAVED" +msgstr "Enregistré" + diff --git a/ui/po/it_IT.po b/ui/po/it_IT.po new file mode 100755 index 0000000..cdc7cfc --- /dev/null +++ b/ui/po/it_IT.po @@ -0,0 +1,333 @@ +msgid "IDS_CALL_HEADER_CREATE_REJECT_MESSAGE" +msgstr "Crea messaggio di rifiuto" + +msgid "IDS_CALL_POP_REJECT_MESSAGE_LIST_IS_EMPTY" +msgstr "L'elenco dei messaggi rifiutati è vuoto" + +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Rifiuta con messaggio" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Chiamata" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Utente non disponib." + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Chiamata terminata" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Chiamata rifiutata" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Disconnesso" + +msgid "IDS_CALL_BODY_INVALID_NUMBER" +msgstr "Numero non valido" + +msgid "IDS_CALL_BODY_IN_CALL" +msgstr "Chiamata" + +msgid "IDS_CALL_BODY_MPTY" +msgstr "Conferenza" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Nessuna risposta" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Numero modificato" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Numero non esistente" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "In attesa" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Persone" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Accetta" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Chiama" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Rubrica" + +msgid "IDS_CALL_BUTTON_END_M_CALL_BUTTON" +msgstr "Termina" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Auric. BT" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "In attesa" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "In conf." + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Muto" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Rifiuta" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Vivavoce" + +msgid "IDS_CALL_BUTTON_SPLIT" +msgstr "Separa" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Recupera" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Conferenza" + +msgid "IDS_CALL_OPT_END_CURRENT_CALL_N_ANSWER" +msgstr "Termina chiamata corrente e rispondi" + +msgid "IDS_CALL_OPT_HOLD_CURRENT_CALL_N_ANSWER" +msgstr "Metti in attesa chiamata corrente e rispondi" + +msgid "IDS_CALL_OPT_PRIVATE" +msgstr "Conversazione privata" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Errore di sistema" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Blocco di tutte le chiamate entranti" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Blocco di tutte le chiamate uscenti" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Chiamata non riuscita" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Solo chiamate di emergenza" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Chiamata non consentita" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Chiamata bloccata" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Trasferimento chiamate attivo: sempre" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Trasferimento chiamate attivo: nessuna risposta" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Trasferimento chiamate attivo: non raggiungibile" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Trasferimento chiamate attivo: occupato" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Chiamata inoltrata" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Numero errato" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Passare da Offline ad altro profilo per accedere ai servizi di rete" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Composizione..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Invio non eseguito. Riprovare" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Chiamata di emergenza" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Solo chiamate FDN" + +msgid "IDS_CALL_POP_HELD" +msgstr "In attesa" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Messa in attesa non eseguita" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Messa in attesa non supportata" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Chiamate in arrivo bloccate durante roaming" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Incompleto" + +msgid "IDS_CALL_POP_JOINED" +msgstr "In conferenza" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Connessione non eseguita" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Connessione non supportata" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Rete occupata" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Rete non disponibile" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Credito esaurito" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Nessun servizio" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operazione rifiutata" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Chiamate internazionali in uscita bloccate tranne verso proprio paese" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Uscenti internazionali bloccate" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefono non inizializzato" + +msgid "IDS_CALL_POP_PS_REJECTED" +msgstr "4422341526 rifiutato" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Ricomposizione..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Servizio non consentito" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Solo chiamate di emergenza. Inserire scheda SIM per accedere ai servizi di rete" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Divisione non eseguita" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Divisione non supportata" + +msgid "IDS_CALL_POP_SWAPPED" +msgstr "Scambiata" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Scambio non eseguito" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Scambio non supportato" + +msgid "IDS_CALL_POP_SWITCHED_TO_BT_HEADSET" +msgstr "Commutato su auricolare BT" + +msgid "IDS_CALL_POP_SWITCHED_TO_PHONE" +msgstr "Telefono attivato" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Errore trasferimento" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Trasferimento non supportato" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Impossibile recuperare" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Non disponibile" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Annullamento attesa eseguito" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Annullamento attesa non supportato" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Utente occupato" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Verifica SIM o inserisci SIM valida" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Chiamata vocale non consentita durante una videochiamata" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Avviso di chiamata attivo" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Gruppo errato" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Rifiuta con messaggio" + +msgid "IDS_CALL_POP_END_ACTIVE_CALL" +msgstr "Termina chiamata attiva" + +msgid "IDS_CALL_OPT_HOLDCALL" +msgstr "Chiamata in attesa" + +msgid "IDS_CALL_OPT_END_HELD_CALL" +msgstr "Termina chiamata in attesa" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Termina tutte le chiamate" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Termina chiamate attive (%d)" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Termina chiamate in attesa (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Cuffie" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Ricevitore" + +msgid "IDS_CALL_BODY_FAILED_TO_REGISTER_ACCOUNT" +msgstr "Registrazione account non riuscita" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Ch. attiva in attesa" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Memoria insufficiente. Eliminare alcuni elementi" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Termina" + +msgid "IDS_MSGC_OPT_SOUND" +msgstr "Suono" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Servizio non disponibile" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Tastiera" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Connessione..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Rifiutata" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Invio..." + +msgid "IDS_CALL_BUTTON2_HIDE_KEYPAD" +msgstr "Nasc. tastiera" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Reg" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Chiamata sconosciuta rifiutata" + +msgid "IDS_CALL_POP_SAVED" +msgstr "Salvato" + diff --git a/ui/po/ja_JP.po b/ui/po/ja_JP.po new file mode 100755 index 0000000..7b5ce4c --- /dev/null +++ b/ui/po/ja_JP.po @@ -0,0 +1,333 @@ +msgid "IDS_CALL_HEADER_CREATE_REJECT_MESSAGE" +msgstr "拒否​メッセージ​の​作成" + +msgid "IDS_CALL_POP_REJECT_MESSAGE_LIST_IS_EMPTY" +msgstr "拒否​メッセージ​リスト​は​空​です" + +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "拒否してSMS送信" + +msgid "IDS_CALL_BODY_CALL" +msgstr "通話設定" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "発信​相手​は​電話​に​出られ​ません" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "通話​終了" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "通話​拒否​されました" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "切断しました。" + +msgid "IDS_CALL_BODY_INVALID_NUMBER" +msgstr "番号​が​無効​です" + +msgid "IDS_CALL_BODY_IN_CALL" +msgstr "通話中" + +msgid "IDS_CALL_BODY_MPTY" +msgstr "マルチ​パーティー" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "応答​なし" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "番号​が​変更​されました" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "番号​が​存在​しません" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "保留中" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "人" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "応答" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "通話を​追加" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "連絡先" + +msgid "IDS_CALL_BUTTON_END_M_CALL_BUTTON" +msgstr "終了" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "ヘッドセット" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "保留" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "参加" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "ミュート" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "拒否" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "スピーカー" + +msgid "IDS_CALL_BUTTON_SPLIT" +msgstr "分割" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "保留解除" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "グループ通話" + +msgid "IDS_CALL_OPT_END_CURRENT_CALL_N_ANSWER" +msgstr "現在の通話を終了して応答" + +msgid "IDS_CALL_OPT_HOLD_CURRENT_CALL_N_ANSWER" +msgstr "現在の通話を保留にして応答" + +msgid "IDS_CALL_OPT_PRIVATE" +msgstr "個人携帯" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "システム​エラー" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "全ての​着信​が​規制​されて​います" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "全ての​発信​が​規制​されて​います" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "発信​できません​でした" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "緊急通報のみ発信可能です。" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "通話​は​許可されて​いません" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "通話​は​規制​されて​います" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "通話​を​転送する:常時" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "通話​を転送​する:​応答​なし" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "通話​を​転送:​​圏外時" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "通話​を​転送:​ビジー時" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "通話転送されました" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "番号​が​正しく​ありません" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "オフライン​から​他の​ネットワーク​サービス​の​接続先​に​変更" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "発信中..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "送信​に​失敗​しました。​リトライ" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "緊急通話" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "FDN電話​限定​です" + +msgid "IDS_CALL_POP_HELD" +msgstr "保留にしました" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "保留​できません​でした" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "保留​に​対応して​いません" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "ローミング​中​は​着信​が​規制​されます" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "操作が中断されました" + +msgid "IDS_CALL_POP_JOINED" +msgstr "参加" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "グループ​通話​参加に失敗しました" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "グループ​通話​参加に対応していません" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "ネットワーク​混雑中" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "ネットワーク​を​利用​できません" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "料金​上限​設定​を​超えて​います" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "サービスが利用できません。" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "操作​は​拒否​されました" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "自国​以外の​全ての​国際​電話​発信​が​規制​されています" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "全ての​国際電話発信​が​規制​されて​います" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "写真​は​初期化​されて​いません" + +msgid "IDS_CALL_POP_PS_REJECTED" +msgstr "%sからの着信を拒否しました" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "リダイヤル中..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "サービス​は​許可されて​いません" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "SOS​通話​のみ。​ SIM​​カード​を​挿入して、​ネットワーク​サービス​に​アクセス​します" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "分割​に​失敗​しました" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "分割​に​対応​して​いません" + +msgid "IDS_CALL_POP_SWAPPED" +msgstr "交換しました" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "切り替え​できません​でした" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "切り替え​に​対応​して​いません" + +msgid "IDS_CALL_POP_SWITCHED_TO_BT_HEADSET" +msgstr "BT​ヘッド​セットに​切り​替え​ました" + +msgid "IDS_CALL_POP_SWITCHED_TO_PHONE" +msgstr "本体​に​切り​替え​ます" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "転送​に​失敗​しました" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "転送​に​対応​して​いません" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "受信できません" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "不可" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "保留解除" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "保留​解除​に​対応して​いません" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "話し中,​または​通信中​です" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "SIM​を​確認​する​か、​有効​な​SIM​を​挿入​して​ください" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "テレビ​電話中​は​音声​電話​を​使用​できません" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "割込​通話​設定中​です" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "グループ​が​間違って​います" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "着信拒否時にSMS送信" + +msgid "IDS_CALL_POP_END_ACTIVE_CALL" +msgstr "現在の​通話​を​終了" + +msgid "IDS_CALL_OPT_HOLDCALL" +msgstr "通話​を​保留​します" + +msgid "IDS_CALL_OPT_END_HELD_CALL" +msgstr "保留中の​通話​を​終了​" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "全ての​相手​と​終話" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "アクティブ​通話​を​終了​する​(%d)" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "保留中の​通話​を​終了​する​(%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "ヘッドホン" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "受話​器" + +msgid "IDS_CALL_BODY_FAILED_TO_REGISTER_ACCOUNT" +msgstr "アカウント​の​登録​に​失敗​しました" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "現在の​通話​を​保留" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "メモリーが​不足​しています。​いくつかのアイテム​を​削除​してください" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "通話​を​終了​" + +msgid "IDS_MSGC_OPT_SOUND" +msgstr "サウンド" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "サービス​を​利用​できません" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "キーパッド" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "接続中..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "拒否されました。" + +msgid "IDS_CALL_POP_SENDING" +msgstr "送信中..." + +msgid "IDS_CALL_BUTTON2_HIDE_KEYPAD" +msgstr "キーパッド​を​非表示" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "録音" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "非通知​通話​を​拒否​しました" + +msgid "IDS_CALL_POP_SAVED" +msgstr "保存しました。" + diff --git a/ui/po/ko_KR.po b/ui/po/ko_KR.po new file mode 100755 index 0000000..1ec8536 --- /dev/null +++ b/ui/po/ko_KR.po @@ -0,0 +1,333 @@ +msgid "IDS_CALL_HEADER_CREATE_REJECT_MESSAGE" +msgstr "수신 거부 메시지 작성" + +msgid "IDS_CALL_POP_REJECT_MESSAGE_LIST_IS_EMPTY" +msgstr "수신 거부 메시지 목록이 비어있습니다" + +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "수신 거절 메시지" + +msgid "IDS_CALL_BODY_CALL" +msgstr "통화" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "상대방이 전화를 받지 않습니다" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "통화가 종료되었습니다" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "전화가 거부되었습니다" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "연결 끊김" + +msgid "IDS_CALL_BODY_INVALID_NUMBER" +msgstr "전화번호가 바르지 않습니다" + +msgid "IDS_CALL_BODY_IN_CALL" +msgstr "통화 중" + +msgid "IDS_CALL_BODY_MPTY" +msgstr "회의통화" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "응답이 없습니다" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "전화번호가 변경되었습니다" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "사용할 수 있는 번호가 없습니다" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "보류됨" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "인원" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "통화" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "통화 추가" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "연락처" + +msgid "IDS_CALL_BUTTON_END_M_CALL_BUTTON" +msgstr "종료" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "헤드셋" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "일시중단" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "연결" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "음소거" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "거절" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "스피커" + +msgid "IDS_CALL_BUTTON_SPLIT" +msgstr "통화 분리" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "중단해제" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "회의통화" + +msgid "IDS_CALL_OPT_END_CURRENT_CALL_N_ANSWER" +msgstr "현재 통화 종료 후 전화 받기" + +msgid "IDS_CALL_OPT_HOLD_CURRENT_CALL_N_ANSWER" +msgstr "현재 통화를 보류 후 전화 받기" + +msgid "IDS_CALL_OPT_PRIVATE" +msgstr "비공개" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "시스템 오류가 발생하였습니다" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "모든 수신 전화가 제한되었습니다" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "모든 발신 전화가 제한되었습니다" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "연결하지 못하였습니다" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "긴급전화만 가능합니다" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "전화를 연결할 수 없습니다" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "통화가 제한되었습니다" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "착신통화 : 항상" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "착신통화 : 응답 없을 때" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "착신통화 : 서비스 지역 이탈 시" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "통화 중일 때" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "착신전환되었습니다" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "전화번호가 바르지 않습니다" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "네트워크에 연결하려면 비행기 탑승 모드를 해제하세요" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "발신 중..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "전송하지 못하였습니다. 잠시 후 다시 시도하세요" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "긴급전화" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "발신 허용 번호로만 전화를 걸 수 있습니다" + +msgid "IDS_CALL_POP_HELD" +msgstr "일시 중단 되었습니다" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "통화를 보류하지 못하였습니다" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "통화 보류가 지원되지 않습니다" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "로밍 중에는 전화 수신이 제한됩니다" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "완료되지 않았습니다" + +msgid "IDS_CALL_POP_JOINED" +msgstr "연결하였습니다" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "연결하지 못하였습니다" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "회의통화가 지원되지 않습니다" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "네트워크 연결 상태가 원활하지 않습니다" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "네트워크에 연결할 수 없습니다" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "크레디트가 없습니다" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "서비스 지역이 아닙니다" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "작업이 거부되었습니다" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "자국으로 거는 전화를 제외한 모든 국제전화 발신이 제한되었습니다" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "국제전화 발신이 제한되었습니다" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "휴대폰이 초기화되지 않았습니다" + +msgid "IDS_CALL_POP_PS_REJECTED" +msgstr "%s이(가) 수신 거부되었습니다" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "다시 거는 중..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "사용할 수 없는 서비스입니다" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "긴급전화만 사용할 수 있습니다. 네트워크 서비스를 이용하려면 SIM을 삽입하세요" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "통화를 분리하지 못하였습니다" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "통화 분리가 지원되지 않습니다" + +msgid "IDS_CALL_POP_SWAPPED" +msgstr "전환되었습니다" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "전환하지 못하였습니다" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "통화 전환이 지원되지 않습니다" + +msgid "IDS_CALL_POP_SWITCHED_TO_BT_HEADSET" +msgstr "블루투스 헤드셋으로 전환되었습니다" + +msgid "IDS_CALL_POP_SWITCHED_TO_PHONE" +msgstr "휴대폰으로 전환되었습니다" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "연결하지 못하였습니다" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "상대방 연결이 지원되지 않습니다" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "통화 보류를 취소할 수 없습니다" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "사용할 수 없음" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "통화 보류가 해제되었습니다" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "통화 보류를 취소할 수 없습니다" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "상대방이 통화 중입니다" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "SIM을 확인해 보거나 사용할 수 있는 SIM을 삽입하세요" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "영상통화 중에는 음성통화를 할 수 없습니다" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "통화대기가 실행되어 있습니다" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "그룹이 바르지 않습니다" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "수신 거절 메시지" + +msgid "IDS_CALL_POP_END_ACTIVE_CALL" +msgstr "현재 통화 종료" + +msgid "IDS_CALL_OPT_HOLDCALL" +msgstr "통화 보류" + +msgid "IDS_CALL_OPT_END_HELD_CALL" +msgstr "보류 통화 종료" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "모든 통화 종료" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "현재 통화(%d개) 종료" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "보류 통화(%d개) 종료" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "헤드폰" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "수화음 송출부" + +msgid "IDS_CALL_BODY_FAILED_TO_REGISTER_ACCOUNT" +msgstr "계정을 등록하지 못하였습니다" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "현재 통화 보류" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "저장 공간이 없습니다. 필요 없는 파일을 삭제하세요" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "통화 종료" + +msgid "IDS_MSGC_OPT_SOUND" +msgstr "소리" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "서비스를 사용할 수 없습니다" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "키패드" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "연결 중..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "수신 거부하였습니다" + +msgid "IDS_CALL_POP_SENDING" +msgstr "전송 중..." + +msgid "IDS_CALL_BUTTON2_HIDE_KEYPAD" +msgstr "키패드 숨기기" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "녹음" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "발신자 번호가 없는 전화를 거부하였습니다" + +msgid "IDS_CALL_POP_SAVED" +msgstr "저장되었습니다" + diff --git a/ui/po/nl_NL.po b/ui/po/nl_NL.po new file mode 100755 index 0000000..db8d6b0 --- /dev/null +++ b/ui/po/nl_NL.po @@ -0,0 +1,333 @@ +msgid "IDS_CALL_HEADER_CREATE_REJECT_MESSAGE" +msgstr "Weigeringsbericht maken" + +msgid "IDS_CALL_POP_REJECT_MESSAGE_LIST_IS_EMPTY" +msgstr "Lijst met weigeringsberichten is leeg" + +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Weigeren met bericht" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Oproepen" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Gebelde niet besch." + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Oproep beëindigd" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Oproep geweigerd" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Verbinding verbroken" + +msgid "IDS_CALL_BODY_INVALID_NUMBER" +msgstr "Ongeldig getal" + +msgid "IDS_CALL_BODY_IN_CALL" +msgstr "In gesprek" + +msgid "IDS_CALL_BODY_MPTY" +msgstr "Multiparty" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Geen gehoor" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Nummer gewijzigd" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Nummer bestaat niet" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "In wacht" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Mensen" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Opnemen" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Nwe oproep" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Contacten" + +msgid "IDS_CALL_BUTTON_END_M_CALL_BUTTON" +msgstr "Stop" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Headset" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "In wacht" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Deeln." + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Dempen" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Weigeren" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Luidspreker" + +msgid "IDS_CALL_BUTTON_SPLIT" +msgstr "Splitsen" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Uit wacht" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Vergaderoproep" + +msgid "IDS_CALL_OPT_END_CURRENT_CALL_N_ANSWER" +msgstr "Huidige oproep beëindigen en opnemen" + +msgid "IDS_CALL_OPT_HOLD_CURRENT_CALL_N_ANSWER" +msgstr "Huidige oproep in de wacht en opnemen" + +msgid "IDS_CALL_OPT_PRIVATE" +msgstr "Privé" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Systeemfout" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Alle inkomende oproepen geblokkeerd" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Alle uitgaande oproepen geblokkeerd" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Oproep mislukt" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Alleen noodoproepen" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Oproep niet toegestaan" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Oproep geblokkeerd" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Alle oproepen doorschakelen" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Oproepen doorschakelen bij geen antwoord" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Doorschakelen indien onbereikbaar" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Doorschakelen bij in gesprek" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Oproep doorgestuurd" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Nummer onjuist" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Voor netwerkdiensten vliegtuigprofiel in ander profiel wijzigen" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Kiezen..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Verzenden mislukt. Opnieuw" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Noodoproep" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Alleen FDN-oproepen" + +msgid "IDS_CALL_POP_HELD" +msgstr "In de wacht" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "In wacht zetten mislukt" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "In wacht zetten niet ondersteund" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Inkomende oproepen in buitenland geblokkeerd" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Niet compleet" + +msgid "IDS_CALL_POP_JOINED" +msgstr "Toegevoegd" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Deelnemen aan multiparty mislukt" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Deelnemen aan multiparty niet ondersteund" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Netwerk bezet" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Netwerk niet beschikbaar" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Beltegoed is op" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Geen netwerk" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Actie geweigerd" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Uitgaande internationale oproepen geblokkeerd behalve naar eigen land" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Uitgaande internationale oproepen geblokkeerd" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefoon niet geïnitialiseerd" + +msgid "IDS_CALL_POP_PS_REJECTED" +msgstr "4422341526 geweigerd" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Opnieuw kiezen..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Dienst niet toegestaan" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Alleen noodoproepen mogelijk. Voor netwerkdiensten SIM-kaart plaatsen" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Uit multiparty halen mislukt" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Uit multiparty halen niet ondersteund" + +msgid "IDS_CALL_POP_SWAPPED" +msgstr "Gewisseld" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Wisselen mislukt" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Wisselen niet ondersteund" + +msgid "IDS_CALL_POP_SWITCHED_TO_BT_HEADSET" +msgstr "Overgeschakeld naar BT-headset" + +msgid "IDS_CALL_POP_SWITCHED_TO_PHONE" +msgstr "Overgeschakeld naar telefoon" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Fout bij doorverbinden" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Doorverbinden niet ondersteund" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Kan de details niet ophalen" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Niet beschikbaar" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Uit wacht halen" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Uit wacht halen niet ondersteund" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "In gesprek" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "SIM controleren of geldige SIM plaatsen" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Spraakoproep is niet toegestaan tijdens videogesprek" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Wisselgesprek" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Groep onjuist" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Oproep met bericht weigeren" + +msgid "IDS_CALL_POP_END_ACTIVE_CALL" +msgstr "Actieve oproep beëindigen" + +msgid "IDS_CALL_OPT_HOLDCALL" +msgstr "In wacht" + +msgid "IDS_CALL_OPT_END_HELD_CALL" +msgstr "Oproep in wacht beëindigen" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Alle gespr. beëindigen" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Actieve oproepen (%d) beëindigen" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Oproepen in de wacht (%d) beëindigen" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Koptelefoons" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Ontvanger" + +msgid "IDS_CALL_BODY_FAILED_TO_REGISTER_ACCOUNT" +msgstr "Kan account niet registreren" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Huidige opr in wacht" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Onvoldoende geheugen. Wis een aantal items" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Einde" + +msgid "IDS_MSGC_OPT_SOUND" +msgstr "Geluid" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Service niet beschikbaar" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Toetsen-\nbord" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Verbinden..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Geweigerd" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Verzenden..." + +msgid "IDS_CALL_BUTTON2_HIDE_KEYPAD" +msgstr "Verberg toetsen" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Opn." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Onbekende oproep geweigerd" + +msgid "IDS_CALL_POP_SAVED" +msgstr "Opgeslagen" + diff --git a/ui/po/pt_PT.po b/ui/po/pt_PT.po new file mode 100755 index 0000000..7d23966 --- /dev/null +++ b/ui/po/pt_PT.po @@ -0,0 +1,333 @@ +msgid "IDS_CALL_HEADER_CREATE_REJECT_MESSAGE" +msgstr "Criar mensagem de rejeição" + +msgid "IDS_CALL_POP_REJECT_MESSAGE_LIST_IS_EMPTY" +msgstr "A lista de mensagens rejeitadas está vazia" + +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Rejeitar com mensagem" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Chamada" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Destinatario indispon" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Chamada terminada" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Chamada rejeitada" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Desligado" + +msgid "IDS_CALL_BODY_INVALID_NUMBER" +msgstr "Número inválido" + +msgid "IDS_CALL_BODY_IN_CALL" +msgstr "Em chamada" + +msgid "IDS_CALL_BODY_MPTY" +msgstr "Conferência" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Não atendida" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Número alterado" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Número inexistente" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Em espera" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Pessoas" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Aceitar" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Ad. cham." + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Contactos" + +msgid "IDS_CALL_BUTTON_END_M_CALL_BUTTON" +msgstr "Terminar" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Auric." + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Reter" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Aderir" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Desl. mic." + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Rejeitar" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Altifal." + +msgid "IDS_CALL_BUTTON_SPLIT" +msgstr "Dividir" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Obter" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Chamada de conferência" + +msgid "IDS_CALL_OPT_END_CURRENT_CALL_N_ANSWER" +msgstr "Terminar a chamada actual e atender" + +msgid "IDS_CALL_OPT_HOLD_CURRENT_CALL_N_ANSWER" +msgstr "Colocar a chamada actual em espera e atender" + +msgid "IDS_CALL_OPT_PRIVATE" +msgstr "Privado" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Erro de sistema" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Todas as chamadas recebidas restringidas" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Todas as chamadas efectuadas restringidas" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Falha na chamada" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Apenas chamadas de emergência" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Chamada não permitida" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Chamada restringida" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Desvio de chamadas activado: Sempre" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Desvio de chamadas activado: Não atende" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Desvio de chamadas activado: Incontactável" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Desvio de chamadas activado: Se ocupado" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Chamada encaminhada" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Número incorrecto" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Mudar de Offline para outro perfil para serviços de rede" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "A marcar..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Falha ao enviar. Tente novamente" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Chamada de emergência" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Só chamadas FDN" + +msgid "IDS_CALL_POP_HELD" +msgstr "Retida" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Falha ao colocar em espera" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Função de espera não suportada" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Chamadas recebidas barradas quando em roaming" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Incompleto" + +msgid "IDS_CALL_POP_JOINED" +msgstr "Unida" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Falha ao aderir" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Adesão não suportada" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Rede ocupada" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Rede indisponível" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Crédito esgotado" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Sem serviço" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operação recusada" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Chamadas internacionais efectuadas barradas excepto para origem" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Chamadas internacionais restringidas" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "O telefone não foi inicializado" + +msgid "IDS_CALL_POP_PS_REJECTED" +msgstr "4422341526 rejeitado" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "A remarcar..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Serviço não permitido" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Apenas chamada SOS. Insira o cartão SIM para aceder aos serviços de rede" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Falha ao dividir" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Divisão não suportada" + +msgid "IDS_CALL_POP_SWAPPED" +msgstr "Mudado" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Falha ao mudar" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Mudança não suportada" + +msgid "IDS_CALL_POP_SWITCHED_TO_BT_HEADSET" +msgstr "Mudado para auricular BT" + +msgid "IDS_CALL_POP_SWITCHED_TO_PHONE" +msgstr "Mudado para telefone" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Erro de transferência" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Transferência não suportada" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Impossível receber" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Indisponível" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Obtida" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Retoma não suportada" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Utilizador ocupado" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Verificar SIM ou inserir SIM válido" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Chamada de voz não permitida durante chamada de vídeo" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Espera activa" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Grupo incorrecto" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Rejeitar chamadas com mensagem" + +msgid "IDS_CALL_POP_END_ACTIVE_CALL" +msgstr "Terminar chamada activa" + +msgid "IDS_CALL_OPT_HOLDCALL" +msgstr "Colocar chamada em espera" + +msgid "IDS_CALL_OPT_END_HELD_CALL" +msgstr "Terminar chamada em espera" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Terminar todas chamadas" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Terminar chamadas activas (%d)" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Terminar chamadas em espera (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Auscultadores" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Destinatário" + +msgid "IDS_CALL_BODY_FAILED_TO_REGISTER_ACCOUNT" +msgstr "Falha ao registar conta" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Col. ch. act. em es." + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Memória insuficiente. Apague alguns itens" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Ter. ch." + +msgid "IDS_MSGC_OPT_SOUND" +msgstr "Som" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Serviço não disponível" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Teclado" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "A ligar..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Rejeitado" + +msgid "IDS_CALL_POP_SENDING" +msgstr "A enviar..." + +msgid "IDS_CALL_BUTTON2_HIDE_KEYPAD" +msgstr "Ocultar teclado" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "GRAV." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Chamada anónima rejeitada" + +msgid "IDS_CALL_POP_SAVED" +msgstr "Guardado" + diff --git a/ui/po/ru_RU.po b/ui/po/ru_RU.po new file mode 100755 index 0000000..728cde0 --- /dev/null +++ b/ui/po/ru_RU.po @@ -0,0 +1,333 @@ +msgid "IDS_CALL_HEADER_CREATE_REJECT_MESSAGE" +msgstr "Создать сообщение для отклонения вызова" + +msgid "IDS_CALL_POP_REJECT_MESSAGE_LIST_IS_EMPTY" +msgstr "Список сообщений для отклонения вызова пуст" + +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Отклонить и отправить сообщение" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Вызовы" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Абонент недоступен" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Вызов завершен" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Вызов отклонен" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Отключено" + +msgid "IDS_CALL_BODY_INVALID_NUMBER" +msgstr "Неправильный номер" + +msgid "IDS_CALL_BODY_IN_CALL" +msgstr "При вызове" + +msgid "IDS_CALL_BODY_MPTY" +msgstr "Конференция" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Нет ответа" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Номер изменен" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Номер не существует" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Удержание" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Люди" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Принять" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Доб. вызов" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Контакты" + +msgid "IDS_CALL_BUTTON_END_M_CALL_BUTTON" +msgstr "Завершить" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Гарнитура" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Удержать" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Конф." + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Звук" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Отказ" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Динамик" + +msgid "IDS_CALL_BUTTON_SPLIT" +msgstr "Разделить" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Извлечь" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Конференция" + +msgid "IDS_CALL_OPT_END_CURRENT_CALL_N_ANSWER" +msgstr "Завершить текущий вызов и ответить" + +msgid "IDS_CALL_OPT_HOLD_CURRENT_CALL_N_ANSWER" +msgstr "Удержать текущий вызов и ответить" + +msgid "IDS_CALL_OPT_PRIVATE" +msgstr "Частный" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Системная ошибка" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Все входящие вызовы запрещены" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Все исходящие вызовы\nзапрещены" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Сбой вызова" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Только экстренные вызовы" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Вызов запрещен" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Вызов запрещен" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Переадресация вызовов: Всегда" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Переадресация вызова: Нет ответа" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Переадресация вызовов: Если недоступен" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Переадресация вызова: Если занято" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Вызов переадресован" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Неверный номер" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Выключите автономный режим для использования сервисов сети" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Вызов..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Сбой отправки. Повторите попытку" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Экстренный вызов" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Только разрешенные вызовы" + +msgid "IDS_CALL_POP_HELD" +msgstr "Удержано" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Сбой удержания" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Удержание не поддерживается" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Входящие вызовы запрещены при роуминге" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Не завершено" + +msgid "IDS_CALL_POP_JOINED" +msgstr "Объединено" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Сбой объединения" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Объединение не поддерживается" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Сеть занята" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Сеть недоступна" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Нет средств на счете" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Нет сети" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Операция отклонена" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Запрет исходящих международных вызовов, кроме домашних" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Исходящие международные\nвызовы запрещены" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Телефон не инициализирован" + +msgid "IDS_CALL_POP_PS_REJECTED" +msgstr "4422341526 отклонен" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Повторный набор..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Сервис запрещен" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Только экстренный вызов. Для доступа к услугам сети вставьте SIM-карту" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Сбой разделения" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Разделение не поддерживается" + +msgid "IDS_CALL_POP_SWAPPED" +msgstr "Переключено" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Сбой переключения" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Переключение не поддерживается" + +msgid "IDS_CALL_POP_SWITCHED_TO_BT_HEADSET" +msgstr "Переключено на гарнитуру Bluetooth" + +msgid "IDS_CALL_POP_SWITCHED_TO_PHONE" +msgstr "Переключено на телефон" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Сбой перевода" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Перевод не поддерживается" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Невозможно извлечь" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Недоступно" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Извлечено" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Извлечение не поддерживается" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Абонент занят" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Проверьте SIM-карту или вставьте действующую SIM-карту" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Голосовой вызов невозможен во время видеовызова" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Ожидание включено" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Неверная грyппа" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Отклонить и сообщение" + +msgid "IDS_CALL_POP_END_ACTIVE_CALL" +msgstr "Завершить активный вызов" + +msgid "IDS_CALL_OPT_HOLDCALL" +msgstr "Удерживаемый" + +msgid "IDS_CALL_OPT_END_HELD_CALL" +msgstr "Завершить удерживаемый вызов" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Завершить все вызовы" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Завершить активные вызовы (%d)" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Завершить удерживаемые вызовы (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Наушники" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Динамик" + +msgid "IDS_CALL_BODY_FAILED_TO_REGISTER_ACCOUNT" +msgstr "Не удается зарегистрировать учетную запись" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Удержать акт. вызов" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Недостаточно памяти. Удалите некоторые элементы" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Заверш." + +msgid "IDS_MSGC_OPT_SOUND" +msgstr "Звук" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Услуга недоступна" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Клавиатура" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Подключение..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Отклонено" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Отправка..." + +msgid "IDS_CALL_BUTTON2_HIDE_KEYPAD" +msgstr "Скрыть клавиатуру" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Зап." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Неизвестный вызов отклонен" + +msgid "IDS_CALL_POP_SAVED" +msgstr "Соxранено" + diff --git a/ui/po/tr_TR.po b/ui/po/tr_TR.po new file mode 100755 index 0000000..b6264cb --- /dev/null +++ b/ui/po/tr_TR.po @@ -0,0 +1,333 @@ +msgid "IDS_CALL_HEADER_CREATE_REJECT_MESSAGE" +msgstr "Reddetme mesajı oluştur" + +msgid "IDS_CALL_POP_REJECT_MESSAGE_LIST_IS_EMPTY" +msgstr "Reddetme mesajı listesi boş" + +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Mesajla reddet" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Arama" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Aranan taraf yok" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Arama sonlandırıldı" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Arama reddedildi" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Bağlantı kesildi" + +msgid "IDS_CALL_BODY_INVALID_NUMBER" +msgstr "Geçersiz numara" + +msgid "IDS_CALL_BODY_IN_CALL" +msgstr "Görüşme" + +msgid "IDS_CALL_BODY_MPTY" +msgstr "Konferans" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Cevap yok" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Numara değiştirildi" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Numara\nyok" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Beklemede" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Kişi" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Kabul et" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Çağrı ekle" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Rehber" + +msgid "IDS_CALL_BUTTON_END_M_CALL_BUTTON" +msgstr "Bitir" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Kulaklık" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Beklet" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Katıl" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Sessiz" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Reddet" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Hoparlör" + +msgid "IDS_CALL_BUTTON_SPLIT" +msgstr "Ayır" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Bırak" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Konferans görüşmesi" + +msgid "IDS_CALL_OPT_END_CURRENT_CALL_N_ANSWER" +msgstr "Geçerli aramayı sonlandır ve yanıtla" + +msgid "IDS_CALL_OPT_HOLD_CURRENT_CALL_N_ANSWER" +msgstr "Geçerli aramayı beklet ve yanıtla" + +msgid "IDS_CALL_OPT_PRIVATE" +msgstr "Özel" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Sistem hatası" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Gelen tüm aramalar engellendi" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Giden tüm aramalar engellendi" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Arama başarısız" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Yalnızca acil aramalar" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "İzin yok" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Arama engellendi" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Arama yönlendirme etkin: Her zaman" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Arama yönlendirme etkin: Cevap yokken" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Arama yönlendirme etkin: Ulaşılamadığında" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Arama yönlendirme etkin: Meşgulken" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Arama iletildi" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Yanlış numara" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Şebeke hizmetleri için Çevrimdışı profilinden çıkın" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Aranıyor..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Gönderim başarısız. Tekrar deneyin" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Acil arama" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "sadece FDN aramalar" + +msgid "IDS_CALL_POP_HELD" +msgstr "Beklemede" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Tutma başarısız" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Tutma desteklenmiyor" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Geçiş yaparken gelen arama engelleme" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Tamamlanmadı" + +msgid "IDS_CALL_POP_JOINED" +msgstr "Konferans başlatıldı" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Katılma başarısız" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Katılma desteklenmiyor" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Şebeke meşgul" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Bağlantı Yok" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Kredi yok" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Servis yok" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "İşlem reddedildi" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Yurt için hariç uluslar arası gideni engelle" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Giden uluslararası aramalar engellendi" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefon başlatılamadı" + +msgid "IDS_CALL_POP_PS_REJECTED" +msgstr "4422341526 reddedildi" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Tekrar aranıyor..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Servise izin yok" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Yalnızca acil aramalar. Şebeke servislerine erişmek için SIM kartını takın" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Ayırma başarısız" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Ayırma desteklenmiyor" + +msgid "IDS_CALL_POP_SWAPPED" +msgstr "Değişti" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Değişme başarısız" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Değişme desteklenmiyor" + +msgid "IDS_CALL_POP_SWITCHED_TO_BT_HEADSET" +msgstr "BT kulaklığa geçildi" + +msgid "IDS_CALL_POP_SWITCHED_TO_PHONE" +msgstr "Telefona geçildi" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Transfer başarısız" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Transfer desteklenmiyor" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Alınamadı" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Mevcut değil" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Alındı" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Bırakma desteklenmiyor" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Kullanıcı meşgul" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "SIM’i doğrula veya geçerli SIM tak" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Görüntülü çağrı sırasında sesli çağrıya izin verilmez" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Bekletme aktif" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Yanlış grup" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Aramayı mesajla reddet" + +msgid "IDS_CALL_POP_END_ACTIVE_CALL" +msgstr "Aktif aramayı bitir" + +msgid "IDS_CALL_OPT_HOLDCALL" +msgstr "Aramayı beklet" + +msgid "IDS_CALL_OPT_END_HELD_CALL" +msgstr "Tutulan aramayı bitir" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Tüm çağrıları sonlandır" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Aktif çağrıları sonlandır (%d)" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Tutulan çağrıları sonlandır (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Kulaklıklar" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Alıcı" + +msgid "IDS_CALL_BODY_FAILED_TO_REGISTER_ACCOUNT" +msgstr "Hesap kaydı başarısız" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Aktif görüşme beklet" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Yeterli hafıza yok. Bazı öğeleri silin." + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Bitir" + +msgid "IDS_MSGC_OPT_SOUND" +msgstr "Ses" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Servis Kullanılamıyor" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Tuşlar" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Bağlanılıyor..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Reddedildi" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Gönderiliyor..." + +msgid "IDS_CALL_BUTTON2_HIDE_KEYPAD" +msgstr "Tuş takmını gzle" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Kayıt" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Bilinmeyen arama reddedildi" + +msgid "IDS_CALL_POP_SAVED" +msgstr "Kaydedildi" + diff --git a/ui/po/zh_CN.po b/ui/po/zh_CN.po new file mode 100755 index 0000000..7f216ad --- /dev/null +++ b/ui/po/zh_CN.po @@ -0,0 +1,333 @@ +msgid "IDS_CALL_HEADER_CREATE_REJECT_MESSAGE" +msgstr "新建拒绝信息" + +msgid "IDS_CALL_POP_REJECT_MESSAGE_LIST_IS_EMPTY" +msgstr "拒绝信息列表空" + +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "带信息拒绝" + +msgid "IDS_CALL_BODY_CALL" +msgstr "通话" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "被呼叫方不可用" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "已结束通话" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "通话被拒绝" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "已断开" + +msgid "IDS_CALL_BODY_INVALID_NUMBER" +msgstr "数值无效" + +msgid "IDS_CALL_BODY_IN_CALL" +msgstr "通话中" + +msgid "IDS_CALL_BODY_MPTY" +msgstr "多方通话" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "无应答" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "号码已更改" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "号码不存在" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "保持中" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "人员" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "接受" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "添加呼叫" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "联系人" + +msgid "IDS_CALL_BUTTON_END_M_CALL_BUTTON" +msgstr "结束" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "耳机" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "保持" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "加入" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "静音" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "拒绝" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "扬声器" + +msgid "IDS_CALL_BUTTON_SPLIT" +msgstr "分开" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "取消保持" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "电话会议" + +msgid "IDS_CALL_OPT_END_CURRENT_CALL_N_ANSWER" +msgstr "结束当前呼叫并应答" + +msgid "IDS_CALL_OPT_HOLD_CURRENT_CALL_N_ANSWER" +msgstr "保持当前电话并应答" + +msgid "IDS_CALL_OPT_PRIVATE" +msgstr "个人通话" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "系统出错" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "禁止所有来电" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "禁止全部拨出电话" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "通话失败" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "仅限紧急通话" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "禁止通话" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "通话被限制" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "激活呼叫转移:始终" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "激活呼叫转移:无应答" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "激活呼叫转移:无法接通" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "激活呼叫转移:遇忙" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "呼叫已转移" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "错误号码" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "关闭飞行模式以使用网络服务" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "拨号中..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "发送失败。再试" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "紧急呼叫" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "仅限 FDN 呼叫" + +msgid "IDS_CALL_POP_HELD" +msgstr "保持" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "通话保持失败" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "通话保持不支持" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "漫游时呼入限制" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "不完整" + +msgid "IDS_CALL_POP_JOINED" +msgstr "已加入" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "加入失败" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "不支持加入" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "网络繁忙" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "网络无法使用" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "无余额" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "无服务" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "拒绝操作" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "除本国外的国际呼出" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "禁止拨打国际长途" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "手机未初始化" + +msgid "IDS_CALL_POP_PS_REJECTED" +msgstr "4422341526 rejected" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "重新拨号中..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "服务禁止" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "只能打SOS电话.请插入SIM卡以访问网络服务" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "断开失败" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "不支持断开" + +msgid "IDS_CALL_POP_SWAPPED" +msgstr "已切换" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "切换失败" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "不支持切换" + +msgid "IDS_CALL_POP_SWITCHED_TO_BT_HEADSET" +msgstr "已切换到蓝牙耳机" + +msgid "IDS_CALL_POP_SWITCHED_TO_PHONE" +msgstr "已切换到手机" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "转换失败" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "不支持转换" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "无法取回" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "不适用" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "取消保持" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "取消保持不支持" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "用户繁忙" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "验证SIM卡或插入有效SIM卡" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "视频通话期间不允许进行语音呼叫" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "等待启动" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "错误分组" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "拒接来电并发送短信" + +msgid "IDS_CALL_POP_END_ACTIVE_CALL" +msgstr "结束当前通话" + +msgid "IDS_CALL_OPT_HOLDCALL" +msgstr "保持通话" + +msgid "IDS_CALL_OPT_END_HELD_CALL" +msgstr "结束保持通话" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "结束所有呼叫" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "结束当前通话 (%d)" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "结束保持通话 (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "耳机" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "听筒" + +msgid "IDS_CALL_BODY_FAILED_TO_REGISTER_ACCOUNT" +msgstr "注册帐户失败" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "保持通话" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "存储空间不足。请删除部分项目" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "结束通话" + +msgid "IDS_MSGC_OPT_SOUND" +msgstr "声音" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "服务无法正常提供" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "键盘" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "连接中..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "被拒绝" + +msgid "IDS_CALL_POP_SENDING" +msgstr "发送中…" + +msgid "IDS_CALL_BUTTON2_HIDE_KEYPAD" +msgstr "隐藏键盘" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "录音" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "已拒绝未知来电" + +msgid "IDS_CALL_POP_SAVED" +msgstr "已存储" + diff --git a/ui/po/zh_HK.po b/ui/po/zh_HK.po new file mode 100755 index 0000000..04228e0 --- /dev/null +++ b/ui/po/zh_HK.po @@ -0,0 +1,333 @@ +msgid "IDS_CALL_HEADER_CREATE_REJECT_MESSAGE" +msgstr "建立拒絕訊息" + +msgid "IDS_CALL_POP_REJECT_MESSAGE_LIST_IS_EMPTY" +msgstr "拒絕訊息清單是空的" + +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "發訊息拒絕" + +msgid "IDS_CALL_BODY_CALL" +msgstr "通話" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "無法接通對方電話" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "通話已結束" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "通話已拒絕" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "已中斷" + +msgid "IDS_CALL_BODY_INVALID_NUMBER" +msgstr "號碼無效" + +msgid "IDS_CALL_BODY_IN_CALL" +msgstr "通話中" + +msgid "IDS_CALL_BODY_MPTY" +msgstr "多方" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "無人接聽" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "號碼已更改" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "號碼不存在" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "保留中" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "People" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "接受" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "加入通話" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "聯絡人" + +msgid "IDS_CALL_BUTTON_END_M_CALL_BUTTON" +msgstr "結束" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "耳機" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "保留" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "加入" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "靜音" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "拒絕" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "揚聲器" + +msgid "IDS_CALL_BUTTON_SPLIT" +msgstr "分割" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "不保留" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "會議通話" + +msgid "IDS_CALL_OPT_END_CURRENT_CALL_N_ANSWER" +msgstr "結束目前通話並接聽" + +msgid "IDS_CALL_OPT_HOLD_CURRENT_CALL_N_ANSWER" +msgstr "保留目前通話並接聽" + +msgid "IDS_CALL_OPT_PRIVATE" +msgstr "私人" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "系統錯誤" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "已限制全部來電" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "已限制所有撥出電話" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "通話失敗" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "只限緊急通話" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "通話不允許" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "通話已限制" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "轉駁來電:全部轉駁" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "轉駁來電:無人接聽" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "來電轉駁:無法接通" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "來電轉駁:線路繁忙" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "通話已轉駁" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "號碼錯誤" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "由離線設定更改為其他設定以使用網絡服務" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "正在撥號..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "發送失敗。請重試" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "緊急通話" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "只限固定撥號通話" + +msgid "IDS_CALL_POP_HELD" +msgstr "已保留" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "保留失敗" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "保留通話不支援" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "漫遊時來電限制" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "未完成" + +msgid "IDS_CALL_POP_JOINED" +msgstr "已加入" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "加入失敗" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "不支援加入" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "網絡繁忙" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "網絡不可用" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "無剩餘" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "無服務" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "操作已拒絕" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "限制撥出國際電話(本地除外)" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "已限制撥出國際長途電話" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "手機未初始化" + +msgid "IDS_CALL_POP_PS_REJECTED" +msgstr "4422341526 rejected" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "正在重撥..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "服務不允許" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "只限 SOS 通話。 請插入 SIM 卡以存取網絡服務" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "分割失敗" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "不支援分割" + +msgid "IDS_CALL_POP_SWAPPED" +msgstr "已切換" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "切換先敗" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "不支援切換" + +msgid "IDS_CALL_POP_SWITCHED_TO_BT_HEADSET" +msgstr "切換至藍牙耳機" + +msgid "IDS_CALL_POP_SWITCHED_TO_PHONE" +msgstr "已切換到手機" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "傳送失敗" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "不支援轉駁" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "無法取回" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "不可用" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "取消保留" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "不支援取消保留" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "用戶繁忙" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "確認SIM卡或插入有效SIM卡" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "視像通話進行中不允許撥打語音通話" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "已啟動來電等待" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "錯誤群組" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "發訊息以拒絕來電" + +msgid "IDS_CALL_POP_END_ACTIVE_CALL" +msgstr "結束當前通話" + +msgid "IDS_CALL_OPT_HOLDCALL" +msgstr "保留通話" + +msgid "IDS_CALL_OPT_END_HELD_CALL" +msgstr "結束已保留通話" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "結束全部通話" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "結束啟動中的通話(%d)" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "結束保留通話(%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "耳機" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "聽筒" + +msgid "IDS_CALL_BODY_FAILED_TO_REGISTER_ACCOUNT" +msgstr "註冊帳戶失敗" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "保留當前通話" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "記憶體不足。請刪除一些項目" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "結束通話" + +msgid "IDS_MSGC_OPT_SOUND" +msgstr "聲音" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "無可用服務" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "鍵盤" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "連接中..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "已拒絕" + +msgid "IDS_CALL_POP_SENDING" +msgstr "正在發送..." + +msgid "IDS_CALL_BUTTON2_HIDE_KEYPAD" +msgstr "隱藏鍵盤" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "錄音" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "已拒絕不明來電" + +msgid "IDS_CALL_POP_SAVED" +msgstr "已儲存" + diff --git a/ui/po/zh_TW.po b/ui/po/zh_TW.po new file mode 100755 index 0000000..3483c0b --- /dev/null +++ b/ui/po/zh_TW.po @@ -0,0 +1,333 @@ +msgid "IDS_CALL_HEADER_CREATE_REJECT_MESSAGE" +msgstr "建立拒絕訊息" + +msgid "IDS_CALL_POP_REJECT_MESSAGE_LIST_IS_EMPTY" +msgstr "拒絕郵件清單是空的" + +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "用訊息拒絕" + +msgid "IDS_CALL_BODY_CALL" +msgstr "通話" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "無法接通電話" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "通話已結束" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "通話遭拒" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "已中斷連線" + +msgid "IDS_CALL_BODY_INVALID_NUMBER" +msgstr "號碼無效" + +msgid "IDS_CALL_BODY_IN_CALL" +msgstr "通話中" + +msgid "IDS_CALL_BODY_MPTY" +msgstr "多方通話" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "無人接聽" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "號碼已更改" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "號碼不存在" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "保留" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "個聯絡人" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "接受" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "增加電話" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "聯絡人" + +msgid "IDS_CALL_BUTTON_END_M_CALL_BUTTON" +msgstr "結束" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "耳機" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "保留" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "加入" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "靜音" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "拒絕" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "揚聲器" + +msgid "IDS_CALL_BUTTON_SPLIT" +msgstr "分割" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "不保留" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "電話會議" + +msgid "IDS_CALL_OPT_END_CURRENT_CALL_N_ANSWER" +msgstr "結束目前通話及應答" + +msgid "IDS_CALL_OPT_HOLD_CURRENT_CALL_N_ANSWER" +msgstr "保留目前通話及接聽" + +msgid "IDS_CALL_OPT_PRIVATE" +msgstr "私人" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "系統錯誤" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "已限制所有來電" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "已阻止所有撥出電話" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "通話失敗" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "僅限緊急通話" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "不允許通話" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "通話受限" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "轉移呼叫:永遠" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "轉移呼叫:無人接聽" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "轉移呼叫:無法接通" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "轉移呼叫:忙線時" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "來電已轉移" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "號碼錯誤" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "由離線更改為其他設定以使用網路服務" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "正在撥號..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "傳送失敗。請重試" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "緊急電話" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "僅限 FDN 通話" + +msgid "IDS_CALL_POP_HELD" +msgstr "已保留" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "保留失敗" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "不支援保留通話" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "漫遊時限制來電" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "不完整" + +msgid "IDS_CALL_POP_JOINED" +msgstr "已加入" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "加入失敗" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "不支援加入" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "網路忙碌" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "無可用網路" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "無剩餘點數" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "無服務" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "操作遭拒" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "限制撥出國際電話(本國除外)" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "已限制撥出國際電話" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "未初始化手機" + +msgid "IDS_CALL_POP_PS_REJECTED" +msgstr "4422341526 rejected" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "正在重撥..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "不允許的服務" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "僅限 SOS 通話。 請插入 SIM 卡以存取網路服務" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "分割失敗" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "分割不受支援" + +msgid "IDS_CALL_POP_SWAPPED" +msgstr "已交換" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "交換失敗" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "不支援交換" + +msgid "IDS_CALL_POP_SWITCHED_TO_BT_HEADSET" +msgstr "下載項目中斷。再試一次?" + +msgid "IDS_CALL_POP_SWITCHED_TO_PHONE" +msgstr "已切換到手機" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "傳輸失敗" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "不支援轉移" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "無法擷取" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "無法使用" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "已取消保留" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "不支援取消保留" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "使用者忙碌" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "驗證SIM卡或插入有效SIM卡" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "視訊通話進行中不允許撥打語音電話" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "已啟動呼叫等待" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "群組錯誤" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "使用訊息拒絕來電" + +msgid "IDS_CALL_POP_END_ACTIVE_CALL" +msgstr "結束當前通話" + +msgid "IDS_CALL_OPT_HOLDCALL" +msgstr "保留通話" + +msgid "IDS_CALL_OPT_END_HELD_CALL" +msgstr "結束已保留通話" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "結束所有通話" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "結束當前通話(%d)" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "結束保留的通話(%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "耳機" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "耳機" + +msgid "IDS_CALL_BODY_FAILED_TO_REGISTER_ACCOUNT" +msgstr "註冊帳號失敗" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "保留當前通話" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "記憶體不足。請刪除部分項目" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "結束通話" + +msgid "IDS_MSGC_OPT_SOUND" +msgstr "聲音" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "無法使用服務" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "鍵盤" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "連線中..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "已拒絕" + +msgid "IDS_CALL_POP_SENDING" +msgstr "正在傳送..." + +msgid "IDS_CALL_BUTTON2_HIDE_KEYPAD" +msgstr "隱藏鍵盤" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "錄影" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "已拒接不明來電" + +msgid "IDS_CALL_POP_SAVED" +msgstr "已儲存" + diff --git a/ui/themes/call_theme.edc b/ui/themes/call_theme.edc new file mode 100755 index 0000000..dd63238 --- /dev/null +++ b/ui/themes/call_theme.edc @@ -0,0 +1,8070 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../vcui-view-layout-hd.h" + +#define FONT_SLP_Bold "SLP:style=Bold" +#define FONT_SLP_Medium "SLP:style=Medium" +#define FONT_SLP_Roman "SLP:style=Roman" + +#define BUTTON_STATE_ENABLED 0 +#define BUTTON_STATE_DISABLED 1 + +#define SCREEN_TYPE "./hd" + +collections { +////////////// elm/button/base/default -disabled ////////////////////////////////////////////// + group { name: "elm/button/base/style_call_sixbtn_disabled"; + images { + image: "vc_six_btn_layout_normal.png" COMP; + } + parts { + part { name: "button_image"; + mouse_events: 1; + scale: 1; + description { state: "default" 0.0; + image { + normal: "vc_six_btn_layout_normal.png"; + border: 9 9 0 0; + border_scale: 1; + } + color: 255 255 255 102; /*40%*/ + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + description { state: "default" 0.0; + visible: 0; + align: 0.5 0.5; + aspect: 0.5 1.0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 0.66; + aspect_preference: VERTICAL; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + fixed: 1 0; + visible: 1; + aspect: 1.0 1.0; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + fixed: 0 0; + visible: 1; + align: 0.5 0.5; + aspect: 1.0 1.0; + rel2.relative: 1.0 1.0; + } + } + part { name: "elm.text"; + type: TEXT; + effect: SOFT_SHADOW; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1.to_y: "elm.swallow.content"; + rel1.relative: 0.5 1.0; + rel2.relative: 0.5 1.0; + color: 255 255 255 51; /*opacity : 20%*/ + color2: 0 0 0 102; + color3: 0 0 0 255; + text { + font: FONT_SLP_Roman; + size: 36; + min: 1 1; + align: 0.5 0.5; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + description { state: "disabled_visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + } + } + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + color: 0 0 0 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "button_unclick"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program { name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,out"; + source: "over2"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "clicked")) + { + set_state(PART:"elm.text", "visible", 0.0); + set_state(PART:"button_image", "visible", 0.0); + } + } + } + program { name: "button_click2"; + signal: "mouse,down,1"; + source: "over3"; + action: STATE_SET "clicked" 0.0; + target: "over3"; + } + program { name: "button_unclick2"; + signal: "mouse,up,1"; + source: "over3"; + action: STATE_SET "default" 0.0; + target: "over3"; + } + program { name: "button_unclick3"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "icononly")) + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"elm.text", "visible", 0.0); + } + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "icon_show"; + signal: "elm,state,icon,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.swallow.content", "visible", 0.0); + else + set_state(PART:"elm.swallow.content", "icononly", 0.0); + } + } + program { name: "icon_hide"; + signal: "elm,state,icon,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "over2"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "disabled_visible", 0.0); + else + set_state(PART:"elm.text", "disabled", 0.0); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "over2"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "disabled_visible")) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } + +////////////// elm/button/base/default - pressed ////////////////////////////////////////////// + group { name: "elm/button/base/style_call_sixbtn_pressed"; + images { + image: "vc_six_btn_layout_press.png" COMP; + image: "vc_six_btn_layout_normal.png" COMP; + } + parts { + part { name: "button_image"; + mouse_events: 1; + scale: 1; + description { state: "default" 0.0; + image { + normal: "vc_six_btn_layout_press.png"; + border: 9 9 0 0; + border_scale: 1; + } + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + image.normal: "vc_six_btn_layout_normal.png"; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + description { state: "default" 0.0; + visible: 1; + align: 0.5 0.5; + aspect: 0.5 1.0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 0.66; + aspect_preference: VERTICAL; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + fixed: 1 0; + visible: 1; + aspect: 1.0 1.0; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + fixed: 0 0; + visible: 1; + align: 0.5 0.5; + aspect: 1.0 1.0; + rel2.relative: 1.0 1.0; + } + } + part { name: "elm.text"; + type: TEXT; + effect: SOFT_SHADOW; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1.to_y: "elm.swallow.content"; + rel1.relative: 0.5 1.0; + rel2.relative: 0.5 1.0; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + text { + font: FONT_SLP_Roman; + size: 36; + min: 1 1; + align: 0.5 0.5; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + color3: 0 0 0 0; + } + description { state: "disabled_visible" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + color3: 0 0 0 0; + visible: 1; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + } + } + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + color: 0 0 0 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "button_unclick"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program { name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,out"; + source: "over2"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "clicked")) + { + set_state(PART:"elm.text", "visible", 0.0); + set_state(PART:"button_image", "visible", 0.0); + } + } + } + program { name: "button_click2"; + signal: "mouse,down,1"; + source: "over3"; + action: STATE_SET "clicked" 0.0; + target: "over3"; + } + program { name: "button_unclick2"; + signal: "mouse,up,1"; + source: "over3"; + action: STATE_SET "default" 0.0; + target: "over3"; + } + program { name: "button_unclick3"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "icononly")) + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"elm.text", "visible", 0.0); + } + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "icon_show"; + signal: "elm,state,icon,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.swallow.content", "visible", 0.0); + else + set_state(PART:"elm.swallow.content", "icononly", 0.0); + } + } + program { name: "icon_hide"; + signal: "elm,state,icon,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "over2"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "disabled_visible", 0.0); + else + set_state(PART:"elm.text", "disabled", 0.0); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "over2"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "disabled_visible")) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } + +////////////// elm/button/base/default ////////////////////////////////////////////// + group { name: "elm/button/base/style_call_sixbtn"; + images { + image: "vc_six_btn_layout_normal.png" COMP; + image: "vc_six_btn_layout_press.png" COMP; + } + parts { + part { name: "button_image"; + mouse_events: 1; + scale: 1; + description { state: "default" 0.0; + image { + normal: "vc_six_btn_layout_normal.png"; + border: 9 9 0 0; + border_scale: 1; + } + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + image.normal: "vc_six_btn_layout_press.png"; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + description { state: "default" 0.0; + visible: 1; + align: 0.5 0.5; + aspect: 0.5 1.0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 0.66; + aspect_preference: VERTICAL; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + fixed: 1 0; + visible: 1; + aspect: 1.0 1.0; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + fixed: 0 0; + visible: 1; + align: 0.5 0.5; + aspect: 1.0 1.0; + rel2.relative: 1.0 1.0; + } + } + part { name: "elm.text"; + type: TEXT; + effect: SOFT_SHADOW; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1.to_y: "elm.swallow.content"; + rel1.relative: 0.5 1.0; + rel2.relative: 0.5 1.0; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + text { + font: FONT_SLP_Roman; + size: 36; + min: 1 1; + align: 0.5 0.5; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + color3: 0 0 0 0; + } + description { state: "disabled_visible" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + color3: 0 0 0 0; + visible: 1; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + } + } + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + color: 0 0 0 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "button_unclick"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program { name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,out"; + source: "over2"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "clicked")) + { + set_state(PART:"elm.text", "visible", 0.0); + set_state(PART:"button_image", "visible", 0.0); + } + } + } + program { name: "button_click2"; + signal: "mouse,down,1"; + source: "over3"; + action: STATE_SET "clicked" 0.0; + target: "over3"; + } + program { name: "button_unclick2"; + signal: "mouse,up,1"; + source: "over3"; + action: STATE_SET "default" 0.0; + target: "over3"; + } + program { name: "button_unclick3"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "icononly")) + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"elm.text", "visible", 0.0); + } + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "icon_show"; + signal: "elm,state,icon,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.swallow.content", "visible", 0.0); + else + set_state(PART:"elm.swallow.content", "icononly", 0.0); + } + } + program { name: "icon_hide"; + signal: "elm,state,icon,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "over2"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "disabled_visible", 0.0); + else + set_state(PART:"elm.text", "disabled", 0.0); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "over2"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "disabled_visible")) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } + +////////////// elm/button/base/icon_only/default ////////////////////////////////////////////// + group { name: "elm/button/base/style_call_smallbtn"; + images { + image: "vc_six_btn_layout_normal.png" COMP; + image: "vc_six_btn_layout_press.png" COMP; + } + parts { + part { name: "button_image"; + mouse_events: 1; + scale: 1; + description { state: "default" 0.0; + image { + normal: "vc_six_btn_layout_normal.png"; + border: 9 9 0 0; + border_scale: 1; + } + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + image.normal: "vc_six_btn_layout_press.png"; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + description { state: "default" 0.0; + visible: 1; + align: 0.5 0.5; + aspect: 0.5 1.0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + aspect_preference: VERTICAL; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + fixed: 1 0; + visible: 1; + aspect: 1.0 1.0; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + fixed: 0 0; + visible: 1; + align: 0.5 0.5; + aspect: 1.0 1.0; + rel2.relative: 1.0 1.0; + } + } + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + color: 0 0 0 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + } + program { name: "button_unclick"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program { name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "button_image"; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,out"; + source: "over2"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "clicked")) + { + set_state(PART:"button_image", "visible", 0.0); + } + } + } + program { name: "button_click2"; + signal: "mouse,down,1"; + source: "over3"; + action: STATE_SET "clicked" 0.0; + target: "over3"; + } + program { name: "button_unclick2"; + signal: "mouse,up,1"; + source: "over3"; + action: STATE_SET "default" 0.0; + target: "over3"; + } + program { name: "button_unclick3"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "icononly")) + set_state(PART:"elm.swallow.content", "visible", 0.0); + } + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.swallow.content", "icononly", 0.0); + } + } + program { name: "icon_show"; + signal: "elm,state,icon,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.swallow.content", "visible", 0.0); + else + set_state(PART:"elm.swallow.content", "icononly", 0.0); + } + } + program { name: "icon_hide"; + signal: "elm,state,icon,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "over2"; + target: "disabler"; + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "over2"; + target: "disabler"; + } + program { name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + } + program { name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + } + } + } + +////////////// elm/button/base/icon_only/default ////////////////////////////////////////////// + group { name: "elm/button/base/style_call_smallbtn_pressed"; + images { + image: "vc_conference_call_btn_normal.png" COMP; + image: "vc_conference_call_btn_press.png" COMP; + } + parts { + part { name: "button_image"; + mouse_events: 1; + scale: 1; + description { state: "default" 0.0; + image { + normal: "vc_conference_call_btn_press.png"; + border: 5 5 0 0; + border_scale: 1; + } + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + image.normal: "vc_conference_call_btn_normal.png"; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + description { state: "default" 0.0; + visible: 1; + align: 0.5 0.5; + aspect: 0.5 1.0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 0.52; + aspect_preference: VERTICAL; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + fixed: 1 0; + visible: 1; + aspect: 1.0 1.0; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + fixed: 0 0; + visible: 1; + align: 0.5 0.5; + aspect: 1.0 1.0; + rel2.relative: 1.0 0.52; + } + } + part { name: "elm.text"; + type: TEXT; + effect: SOFT_SHADOW; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1.to_y: "elm.swallow.content"; + rel1.relative: 0.5 1.0; + rel2.relative: 0.5 1.0; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + text { + font: FONT_SLP_Roman; + size: 20; + min: 1 1; + align: 0.5 0.5; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + color3: 0 0 0 0; + } + description { state: "disabled_visible" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + color3: 0 0 0 0; + visible: 1; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + } + } + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + color: 0 0 0 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "button_unclick"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program { name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,out"; + source: "over2"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "clicked")) + { + set_state(PART:"elm.text", "visible", 0.0); + set_state(PART:"button_image", "visible", 0.0); + } + } + } + program { name: "button_click2"; + signal: "mouse,down,1"; + source: "over3"; + action: STATE_SET "clicked" 0.0; + target: "over3"; + } + program { name: "button_unclick2"; + signal: "mouse,up,1"; + source: "over3"; + action: STATE_SET "default" 0.0; + target: "over3"; + } + program { name: "button_unclick3"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "icononly")) + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"elm.text", "visible", 0.0); + } + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "icon_show"; + signal: "elm,state,icon,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.swallow.content", "visible", 0.0); + else + set_state(PART:"elm.swallow.content", "icononly", 0.0); + } + } + program { name: "icon_hide"; + signal: "elm,state,icon,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "over2"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "disabled_visible", 0.0); + else + set_state(PART:"elm.text", "disabled", 0.0); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "over2"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "disabled_visible")) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } + +////////////// elm/button/base/icon_only/default ////////////////////////////////////////////// + group { name: "elm/button/base/icon_only/style_call_icon_only_private"; + images { + image: "vc_conference_call_btn_normal.png" COMP; + image: "vc_conference_call_btn_press.png" COMP; + } + parts { + part { name: "button_image"; + mouse_events: 1; + scale: 1; + description { state: "default" 0.0; + min: 120 72; + max: 120 72; + image { + normal: "vc_conference_call_btn_normal.png"; + border: 5 5 0 0; + border_scale: 1; + } + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + image { + normal: "vc_conference_call_btn_press.png"; + border: 5 5 0 0; + border_scale: 1; + } + } + description { state: "disabled" 0.0; + inherit: "clicked" 0.0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: 120 72; + max: 120 72; + fixed: 1 1; + visible: 0; + rel1 { to: "button_image"; } + rel2 { to: "button_image"; } + align: 0.5 0.5; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + } + } + part { name: "over1"; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + rel1.to: "button_image"; + rel2.to: "button_image"; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "over2"; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 255 255 255 0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 0; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + rel1.to: "button_image"; + rel2.to: "button_image"; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over1"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + } + program { name: "button_unclick"; + signal: "mouse,up,1"; + source: "over1"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program { name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "button_image"; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,out"; + source: "over1"; + action: STATE_SET "default" 0.0; + target: "button_image"; + } + program { name: "button_click2"; + signal: "mouse,down,1"; + source: "over2"; + action: STATE_SET "clicked" 0.0; + target: "over2"; + } + program { name: "button_unclick2"; + signal: "mouse,up,1"; + source: "over2"; + action: STATE_SET "default" 0.0; + target: "over2"; + after: "button_unclick3"; + } + program { name: "button_unclick3"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "over1"; + target: "disabler"; + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "over1"; + target: "disabler"; + } + program { name: "icon_show"; + signal: "elm,state,icon,visible"; + source: "elm"; + action: STATE_SET "visible" 0.0; + target: "elm.swallow.content"; + } + program { name: "icon_hide"; + signal: "elm,state,icon,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + } + program { name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + } + } + } + +////////////// elm/button/base/text_only/style_call_small_text_only_red ////////////////////////////////////////////// + group { name: "elm/button/base/text_only/style_call_small_text_only_red"; + images { + image: "vc_button_red_normal.png" COMP; + image: "vc_button_press.png" COMP; + } + parts { + part { name: "button_image"; + mouse_events: 1; + scale: 1; + effect: SOFT_SHADOW; + description { state: "default" 0.0; + min: 100 50; + image { + normal: "vc_button_red_normal.png"; + border: 16 16 0 0; + border_scale: 1; + } + } + description { state: "clicked" 0.0; + min: 100 50; + image { + normal: "vc_button_press.png"; + border: 16 16 0 0; + border_scale: 1; + } + } + description { state: "disabled" 0.0; + inherit: "clicked" 0.0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + } + } + part { name: "elm.text"; + type: TEXT; + effect: SHADOW; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + fixed: 1 1; + align: 0.5 0.5; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + text { + font: FONT_SLP_Medium; + size: 36; + min: 0 0; + align: 0.5 0.5; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + color3: 0 0 0 0; + } + description { state: "disabled_visible" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + color3: 0 0 0 0; + visible: 1; + min: 1 1; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + color: 255 255 255 255; + } + } + part { name: "over1"; + mouse_events: 0; + description { state: "default" 0.0; + rel2.relative: 1.0 0.5; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + } + part { name: "over2"; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "over3"; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 255 255 255 0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 0; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "button_unclick"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program { name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,out"; + source: "over2"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "clicked")) + { + set_state(PART:"elm.text", "visible", 0.0); + set_state(PART:"button_image", "visible", 0.0); + } + } + } + program { name: "button_click2"; + signal: "mouse,down,1"; + source: "over3"; + action: STATE_SET "clicked" 0.0; + target: "over3"; + } + program { name: "button_unclick2"; + signal: "mouse,up,1"; + source: "over3"; + action: STATE_SET "default" 0.0; + target: "over3"; + } + program { name: "button_unclick3"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.text"; + } + + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "over1"; + target: "over2"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "disabled_visible", 0.0); + else + set_state(PART:"elm.text", "disabled", 0.0); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "over1"; + target: "over2"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "disabled_visible")) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } + +////////////// elm/button/base/text_only/style_call_text_only_red ////////////////////////////////////////////// + group { name: "elm/button/base/text_only/style_call_text_only_red"; + images { + image: "vc_button_red_normal.png" COMP; + image: "vc_button_press.png" COMP; + } + parts { + part { name: "button_image"; + mouse_events: 1; + scale: 1; + effect: SOFT_SHADOW; + description { state: "default" 0.0; + min: 100 50; + image { + normal: "vc_button_red_normal.png"; + border: 16 16 0 0; + border_scale: 1; + } + } + description { state: "clicked" 0.0; + min: 100 50; + image { + normal: "vc_button_press.png"; + border: 16 16 0 0; + border_scale: 1; + } + } + description { state: "disabled" 0.0; + inherit: "clicked" 0.0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + } + } + part { name: "elm.text"; + type: TEXT; + effect: SHADOW; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + fixed: 1 1; + align: 0.5 0.5; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + text { + font: FONT_SLP_Medium; + size: 48; + min: 0 0; + align: 0.5 0.5; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + color3: 0 0 0 0; + } + description { state: "disabled_visible" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + color3: 0 0 0 0; + visible: 1; + min: 1 1; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + color: 255 255 255 255; + } + } + part { name: "over1"; + mouse_events: 0; + description { state: "default" 0.0; + rel2.relative: 1.0 0.5; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + } + part { name: "over2"; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "over3"; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 255 255 255 0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 0; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "button_unclick"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program { name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,out"; + source: "over2"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "clicked")) + { + set_state(PART:"elm.text", "visible", 0.0); + set_state(PART:"button_image", "visible", 0.0); + } + } + } + program { name: "button_click2"; + signal: "mouse,down,1"; + source: "over3"; + action: STATE_SET "clicked" 0.0; + target: "over3"; + } + program { name: "button_unclick2"; + signal: "mouse,up,1"; + source: "over3"; + action: STATE_SET "default" 0.0; + target: "over3"; + } + program { name: "button_unclick3"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.text"; + } + + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "over1"; + target: "over2"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "disabled_visible", 0.0); + else + set_state(PART:"elm.text", "disabled", 0.0); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "over1"; + target: "over2"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "disabled_visible")) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } + + + /////////////////////////////////////////////////////////////////////////////////////// + group { name: "elm/button/base/multiline_text_black"; + images { + image: "vc_second_mt_btn_normal.png" COMP; + image: "vc_button_press.png" COMP; + } + script { + public button_state = BUTTON_STATE_ENABLED; + } + styles{ + style { name: "btn_multiline_navigationbar_controlbar_style"; + base: "font=SLP:style=Medium font_size="48" align=center color=#ffffff wrap=mixed"; + tag: "br" "\n"; + tag: "ps" "ps"; + tag: "tab" "\t"; + } + } + parts { + part { name: "button_image"; + type: IMAGE; + mouse_events: 1; + scale: 1; + description { state: "default" 0.0; + min: 22 46; + rel1.offset: 0 0; + rel2.offset: -1 -1; + image.normal: "vc_second_mt_btn_normal.png"; + image.border: 16 16 0 0; + color: 255 255 255 255; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + image.normal: "vc_button_press.png"; + } + } + part { + name: "padding_left_top"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 0.0 0.0; + min: 10 2; + fixed: 1 1; + visible: 0; + } + } + part { + name: "padding_right_bottom"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 1.0 1.0; + rel1.relative: 1.0 1.0; + rel2.relative: 1.0 1.0; + min: 10 2; + fixed: 1 1; + visible: 0; + } + } + part { + name: "icon_rect"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + min: 0 0; + fixed: 1 0; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + align: 0.0 0.5; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + min: 22 22; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_after_icon"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + align: 0.0 0.0; + rel1 { relative: 1.0 0.0; to: "icon_rect"; } + rel2 { relative: 1.0 1.0; to: "icon_rect"; } + fixed: 1 0; + min: 0 0; + color: 0 0 0 0; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + min: 6 0; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_before_text"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 1.0 0.5; + visible: 0; + rel1 { relative: 0.0 1.0; to_x: "elm.text"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to_x: "elm.text"; to_y: "padding_right_bottom"; } + fixed: 1 0; + min: 6 0; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + clip_to: "clipper"; + description { state: "default" 0.0; + visible: 0; + align: 0.0 0.5; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + fixed: 1 0; + } + description { state: "visible" 0.0; + fixed: 1 0; + visible: 1; + min: 22 22; + max: 22 22; + align: 1.0 0.5; + rel1 { relative: 0.0 1.0; to_x: "padding_before_text"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to_x: "padding_before_text"; to_y: "padding_right_bottom"; } + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + } + description { state: "icononly" 0.0; + visible: 1; + min: 30 30; + max: 30 30; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to: "padding_right_bottom"; } + align: 0.5 0.5; + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + } + } + part { name: "elm.text"; + type: TEXTBLOCK; + mouse_events: 0; + scale: 1; + clip_to: "clipper"; + description { state: "default" 0.0; + visible: 0; + rel1 { relative: 1.0 1.0; to_x: "padding_after_icon"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to: "padding_right_bottom"; } + align: 0.5 0.5; + color: 255 255 255 255; + text { + style: "btn_multiline_navigationbar_controlbar_style"; + min: 0 0; + max: 0 1; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 80 0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 0 0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 0 0; + color: 255 255 255 255; + } + } + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "clipper"; + type: RECT; + description { state: "default" 0.0; + color: 255 255 255 255; + } + description { state: "disabled" 0.0; + color: 255 255 255 127; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + after: "text_clicked"; + } + program { name: "text_clicked"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "clicked", 0.0); + } + } + program { name: "button_unpress"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,up,1"; + source: "over3"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (strcmp(st, "icononly")) { + emit("elm,action,default,text,set", ""); + set_state(PART:"elm.text", "visible", 0.0); + } + if(get_int(button_state) != BUTTON_STATE_DISABLED) + set_state(PART:"button_image", "default", 0.0); + } + after: button_unpress; + } + program { name: "button_unclick3"; + signal: "mouse,clicked,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "icononly")) { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"icon_rect", "visible", 0.0); + set_state(PART:"padding_after_icon", "visible", 0.0); + } + set_state(PART:"elm.text", "visible", 0.0); + } + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "visible")) { + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"icon_rect", "icononly", 0.0); + set_state(PART:"padding_after_icon", "icononly", 0.0); + } + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "icon_show"; + signal: "elm,state,icon,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"icon_rect", "visible", 0.0); + set_state(PART:"padding_after_icon", "visible", 0.0); + } + else + { + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"icon_rect", "icononly", 0.0); + set_state(PART:"padding_after_icon", "icononly", 0.0); + } + } + } + program { name: "icon_hide"; + signal: "elm,state,icon,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "clipper"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + set_int(button_state, BUTTON_STATE_DISABLED); + set_state(PART:"elm.text", "visible", 0.0); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "clipper"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + set_int(button_state, BUTTON_STATE_ENABLED); + set_state(PART:"elm.text", "visible", 0.0); + } + } + program { name: "focused"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + action: STATE_SET "default" 0.0; + target: "button_image"; + after: "unfocus_text"; + } + program { name: "unfocus_text"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } + + /////////////////////////////////////////////////////////////////////////////////////// + group { name: "elm/button/base/multiline_text_red"; + images { + image: "vc_button_red_normal.png" COMP; + image: "vc_button_press.png" COMP; + } + script { + public button_state = BUTTON_STATE_ENABLED; + } + styles{ + style { name: "btn_multiline_navigationbar_controlbar_style2"; + base: "font=SLP:style=Medium font_size="48" align=center color=#ffffff wrap=mixed"; + tag: "br" "\n"; + tag: "ps" "ps"; + tag: "tab" "\t"; + } + } + parts { + part { name: "button_image"; + type: IMAGE; + mouse_events: 1; + scale: 1; + description { state: "default" 0.0; + min: 22 46; + rel1.offset: 0 0; + rel2.offset: -1 -1; + image.normal: "vc_button_red_normal.png"; + image.border: 16 16 0 0; + color: 255 255 255 255; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + image.normal: "vc_button_press.png"; + } + } + part { + name: "padding_left_top"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 0.0 0.0; + min: 10 2; + fixed: 1 1; + visible: 0; + } + } + part { + name: "padding_right_bottom"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 1.0 1.0; + rel1.relative: 1.0 1.0; + rel2.relative: 1.0 1.0; + min: 10 2; + fixed: 1 1; + visible: 0; + } + } + part { + name: "icon_rect"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + min: 0 0; + fixed: 1 0; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + align: 0.0 0.5; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + min: 22 22; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_after_icon"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + align: 0.0 0.0; + rel1 { relative: 1.0 0.0; to: "icon_rect"; } + rel2 { relative: 1.0 1.0; to: "icon_rect"; } + fixed: 1 0; + min: 0 0; + color: 0 0 0 0; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + min: 6 0; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_before_text"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 1.0 0.5; + visible: 0; + rel1 { relative: 0.0 1.0; to_x: "elm.text"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to_x: "elm.text"; to_y: "padding_right_bottom"; } + fixed: 1 0; + min: 6 0; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + clip_to: "clipper"; + description { state: "default" 0.0; + visible: 0; + align: 0.0 0.5; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + fixed: 1 0; + } + description { state: "visible" 0.0; + fixed: 1 0; + visible: 1; + min: 22 22; + max: 22 22; + align: 1.0 0.5; + rel1 { relative: 0.0 1.0; to_x: "padding_before_text"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to_x: "padding_before_text"; to_y: "padding_right_bottom"; } + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + } + description { state: "icononly" 0.0; + visible: 1; + min: 30 30; + max: 30 30; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to: "padding_right_bottom"; } + align: 0.5 0.5; + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + } + } + part { name: "elm.text"; + type: TEXTBLOCK; + mouse_events: 0; + scale: 1; + clip_to: "clipper"; + description { state: "default" 0.0; + visible: 0; + rel1 { relative: 1.0 1.0; to_x: "padding_after_icon"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to: "padding_right_bottom"; } + //max: 150 46; + align: 0.5 0.5; + color: 255 255 255 255; + text { + style: "btn_multiline_navigationbar_controlbar_style2"; + min: 0 0; + max: 0 1; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 80 0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 0 0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 0 0; + color: 255 255 255 255; + } + } + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "clipper"; + type: RECT; + description { state: "default" 0.0; + color: 255 255 255 255; + } + description { state: "disabled" 0.0; + color: 255 255 255 127; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + after: "text_clicked"; + } + program { name: "text_clicked"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "clicked", 0.0); + } + } + program { name: "button_unpress"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,up,1"; + source: "over3"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (strcmp(st, "icononly")) { + emit("elm,action,default,text,set", ""); + set_state(PART:"elm.text", "visible", 0.0); + } + if(get_int(button_state) != BUTTON_STATE_DISABLED) + set_state(PART:"button_image", "default", 0.0); + } + after: button_unpress; + } + program { name: "button_unclick3"; + signal: "mouse,clicked,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "icononly")) { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"icon_rect", "visible", 0.0); + set_state(PART:"padding_after_icon", "visible", 0.0); + } + set_state(PART:"elm.text", "visible", 0.0); + } + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "visible")) { + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"icon_rect", "icononly", 0.0); + set_state(PART:"padding_after_icon", "icononly", 0.0); + } + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "icon_show"; + signal: "elm,state,icon,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"icon_rect", "visible", 0.0); + set_state(PART:"padding_after_icon", "visible", 0.0); + } + else + { + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"icon_rect", "icononly", 0.0); + set_state(PART:"padding_after_icon", "icononly", 0.0); + } + } + } + program { name: "icon_hide"; + signal: "elm,state,icon,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "clipper"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + set_int(button_state, BUTTON_STATE_DISABLED); + set_state(PART:"elm.text", "visible", 0.0); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "clipper"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + set_int(button_state, BUTTON_STATE_ENABLED); + set_state(PART:"elm.text", "visible", 0.0); + } + } + program { name: "focused"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + action: STATE_SET "default" 0.0; + target: "button_image"; + after: "unfocus_text"; + } + program { name: "unfocus_text"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } + +////////////// elm/button/base/text_only/title ////////////////////////////////////////////// + group { name: "elm/button/base/text_only/style_call_text_only_green"; + images { + image: "vc_btn_green.png" COMP; + image: "vc_button_press.png" COMP; + } + parts { + part { name: "button_image"; + mouse_events: 1; + scale: 1; + effect: SOFT_SHADOW; + description { state: "default" 0.0; + min: 100 50; + image { + normal: "vc_btn_green.png"; + border: 16 16 0 0; + border_scale: 1; + } + } + description { state: "clicked" 0.0; + min: 100 50; + image { + normal: "vc_button_press.png"; + border: 16 16 0 0; + border_scale: 1; + } + } + description { state: "disabled" 0.0; + inherit: "clicked" 0.0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + } + } + part { name: "elm.text"; + type: TEXT; + effect: SHADOW; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + fixed: 1 1; + align: 0.5 0.5; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + text { + font: FONT_SLP_Medium; + size: 54; + min: 0 0; + align: 0.5 0.5; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + color3: 0 0 0 0; + } + description { state: "disabled_visible" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + color3: 0 0 0 0; + visible: 1; + min: 1 1; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + color: 255 255 255 255; + } + } + part { name: "over1"; + mouse_events: 0; + description { state: "default" 0.0; + rel2.relative: 1.0 0.5; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + } + part { name: "over2"; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "over3"; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 255 255 255 0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 0; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "button_unclick"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program { name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,out"; + source: "over2"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "clicked")) + { + set_state(PART:"elm.text", "visible", 0.0); + set_state(PART:"button_image", "visible", 0.0); + } + } + } + program { name: "button_click2"; + signal: "mouse,down,1"; + source: "over3"; + action: STATE_SET "clicked" 0.0; + target: "over3"; + } + program { name: "button_unclick2"; + signal: "mouse,up,1"; + source: "over3"; + action: STATE_SET "default" 0.0; + target: "over3"; + } + program { name: "button_unclick3"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.text"; + } + + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "over1"; + target: "over2"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "disabled_visible", 0.0); + else + set_state(PART:"elm.text", "disabled", 0.0); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "over1"; + target: "over2"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "disabled_visible")) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } + +////////////// HIDE_BUTTON (text_only/title) ////////////////////////////////////////////// + group { name: "elm/button/base/text_only/style_keypad_hide_button"; + images { + image: "vc_button_hide_keypad_normal.png" COMP; + image: "vc_button_press.png" COMP; + } + parts { + part { name: "button_image"; + mouse_events: 1; + scale: 1; + effect: SOFT_SHADOW; + description { state: "default" 0.0; + image { + normal: "vc_button_hide_keypad_normal.png"; + border: 10 10 0 0; + border_scale: 1; + } + } + description { state: "clicked" 0.0; + image { + normal: "vc_button_press.png"; + border: 10 10 0 0; + border_scale: 1; + } + } + description { state: "disabled" 0.0; + inherit: "clicked" 0.0; + } + description { state: "focused" 0.0; + inherit: "clicked" 0.0; + } + } + part { name: "elm.text"; + type: TEXT; + effect: SHADOW; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + fixed: 1 1; + align: 0.5 0.5; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + text { + font: FONT_SLP_Medium; + size: 48; + min: 0 0; + align: 0.5 0.5; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + color3: 0 0 0 0; + } + description { state: "disabled_visible" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + color3: 0 0 0 0; + visible: 1; + min: 1 1; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + color: 255 255 255 255; + } + } + part { name: "over1"; + mouse_events: 0; + description { state: "default" 0.0; + rel2.relative: 1.0 0.5; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + } + part { name: "over2"; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "over3"; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 255 255 255 0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 0; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "button_unclick"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program { name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,out"; + source: "over2"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "clicked")) + { + set_state(PART:"elm.text", "visible", 0.0); + set_state(PART:"button_image", "visible", 0.0); + } + } + } + program { name: "button_click2"; + signal: "mouse,down,1"; + source: "over3"; + action: STATE_SET "clicked" 0.0; + target: "over3"; + } + program { name: "button_unclick2"; + signal: "mouse,up,1"; + source: "over3"; + action: STATE_SET "default" 0.0; + target: "over3"; + } + program { name: "button_unclick3"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.text"; + } + + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "over1"; + target: "over2"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "disabled_visible", 0.0); + else + set_state(PART:"elm.text", "disabled", 0.0); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "over1"; + target: "over2"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "disabled_visible")) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } + +////////////// HIDE_BUTTON (text_only/title) ////////////////////////////////////////////// + group { name: "elm/button/base/text_only/style_keypad_end_button"; + images { + image: "vc_button_red_normal.png" COMP; + image: "vc_button_press.png" COMP; + } + parts { + part { name: "button_image"; + mouse_events: 1; + scale: 1; + effect: SOFT_SHADOW; + description { state: "default" 0.0; + image { + normal: "vc_button_red_normal.png"; + border: 16 16 0 0; + border_scale: 1; + } + } + description { state: "clicked" 0.0; + image { + normal: "vc_button_press.png"; + border: 16 16 0 0; + border_scale: 1; + } + } + description { state: "disabled" 0.0; + inherit: "clicked" 0.0; + } + description { state: "focused" 0.0; + inherit: "clicked" 0.0; + } + } + part { name: "elm.text"; + type: TEXT; + effect: SHADOW; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + fixed: 1 1; + align: 0.5 0.5; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + text { + font: FONT_SLP_Medium; + size: 48; + min: 0 0; + align: 0.5 0.5; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + color3: 0 0 0 0; + } + description { state: "disabled_visible" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + color3: 0 0 0 0; + visible: 1; + min: 1 1; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + color: 255 255 255 255; + } + } + part { name: "over1"; + mouse_events: 0; + description { state: "default" 0.0; + rel2.relative: 1.0 0.5; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + } + part { name: "over2"; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "over3"; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 255 255 255 0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 0; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "button_unclick"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program { name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,out"; + source: "over2"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "clicked")) + { + set_state(PART:"elm.text", "visible", 0.0); + set_state(PART:"button_image", "visible", 0.0); + } + } + } + program { name: "button_click2"; + signal: "mouse,down,1"; + source: "over3"; + action: STATE_SET "clicked" 0.0; + target: "over3"; + } + program { name: "button_unclick2"; + signal: "mouse,up,1"; + source: "over3"; + action: STATE_SET "default" 0.0; + target: "over3"; + } + program { name: "button_unclick3"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.text"; + } + + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "over1"; + target: "over2"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "disabled_visible", 0.0); + else + set_state(PART:"elm.text", "disabled", 0.0); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "over1"; + target: "over2"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "disabled_visible")) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } + +////////////// elm/button/base/icon_only/default ////////////////////////////////////////////// + group { name: "elm/button/base/style_call_smallbtn_red"; + images { + image: "vc_conference_call_btn_red.png" COMP; + image: "vc_conference_call_btn_press.png" COMP; + } + parts { + part { name: "button_image"; + mouse_events: 1; + scale: 1; + description { state: "default" 0.0; + min: 120 72; + max: 120 72; + image { + normal: "vc_conference_call_btn_red.png"; + border: 5 5 0 0; + border_scale: 1; + } + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + image.normal: "vc_conference_call_btn_press.png"; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: 120 72; + max: 120 72; + fixed: 1 1; + visible: 1; + rel1 { to: "button_image"; } + rel2 { to: "button_image"; } + align: 0.5 0.5; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + } + } + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + color: 0 0 0 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + } + program { name: "button_unclick"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program { name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "button_image"; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,out"; + source: "over2"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "clicked")) { + set_state(PART:"button_image", "visible", 0.0); + } + } + } + program { name: "button_click2"; + signal: "mouse,down,1"; + source: "over3"; + action: STATE_SET "clicked" 0.0; + target: "over3"; + } + program { name: "button_unclick2"; + signal: "mouse,up,1"; + source: "over3"; + action: STATE_SET "default" 0.0; + target: "over3"; + } + program { name: "button_unclick3"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "icononly")) + set_state(PART:"elm.swallow.content", "visible", 0.0); + } + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.swallow.content", "icononly", 0.0); + } + } + program { name: "icon_show"; + signal: "elm,state,icon,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.swallow.content", "visible", 0.0); + else + set_state(PART:"elm.swallow.content", "icononly", 0.0); + } + } + program { name: "icon_hide"; + signal: "elm,state,icon,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "over2"; + target: "disabler"; + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "over2"; + target: "disabler"; + } + program { name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + } + program { name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + } + } + } + +//////////////////////////////////////////////////// +///////// multicall-list genlist /////////// +#define BEAT_GENLIST_PART_BASE( param_item_height ) \ + part { name: "base"; \ + type: RECT; \ + repeat_events: 1; \ + scale: 1; \ + description { state: "default" 0.0; \ + min: 0 param_item_height; \ + color: 0 0 0 24; \ + } \ + } + +#define BEAT_GENLIST_PART_BG \ + part { name: "bg"; \ + type: RECT; \ + clip_to: "disclip"; \ + mouse_events: 0; \ + description { state: "default" 0.0; \ + color: 0 0 0 24; \ + } \ + } + +#define BEAT_GENLIST_PART_BG_IMAGE \ + part { name: "bg_image"; \ + clip_to: "disclip"; \ + mouse_events: 0; \ + description { state: "default" 0.0; \ + visible: 0; \ + image.normal: "vc_conf_call_list_bg.png"; \ + } \ + description { state: "selected" 0.0; \ + inherit: "default" 0.0; \ + visible: 1; \ + } \ + } + +#define GENLIST_PART_BG_IMAGE \ + part { name: "bg_image"; \ + type: RECT; \ + clip_to: "disclip"; \ + mouse_events: 0; \ + description { state: "default" 0.0; \ + color: 199 185 164 0; \ + } \ + description { state: "selected" 0.0; \ + inherit: "default" 0.0; \ + color: 199 185 164 255; \ + } \ + } + +#define GENLIST_PART_BG_IMAGE_NO_SELECT \ + part { name: "bg_image"; \ + type: RECT; \ + clip_to: "disclip"; \ + mouse_events: 0; \ + description { state: "default" 0.0; \ + color: 199 185 164 0; \ + } \ + description { state: "selected" 0.0; \ + inherit: "default" 0.0; \ + } \ + } + +#define BEAT_GENLIST_PART_BOTTOM_LINE \ + part { name: "bottom_line"; \ + type: RECT; \ + clip_to: "disclip"; \ + mouse_events: 0; \ + description { state: "default" 0.0; \ + min: 0 1; \ + fixed: 0 1; \ + visible: 1; \ + color: 0 0 0 24; \ + rel1 { \ + relative: 0.0 1.0; \ + offset: 0 -1; \ + } \ + } \ + } + +#define BEAT_GENLIST_PART_PADDING_LEFT( param_padding_size ) \ + part { name: "elm.padding.left"; \ + type: RECT; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + min: param_padding_size 0; \ + fixed: 1 0; \ + visible: 0; \ + rel2.relative: 0.0 1.0; \ + align: 0.0 0.0; \ + } \ + } + +#define BEAT_GENLIST_PART_PADDING_RIGHT( param_padding_size ) \ + part { name: "elm.padding.right"; \ + type: RECT; \ + scale: 1; \ + description { state: "default" 0.0; \ + min: param_padding_size 0; \ + fixed: 1 0; \ + visible: 0; \ + rel1.relative: 1.0 0.0; \ + align: 1.0 0.0; \ + } \ + } + +#define BEAT_GENLIST_PART_DISCLIP \ + part { name: "disclip"; \ + type: RECT; \ + description { state: "default" 0.0; \ + } \ + description { state: "disabled" 0.0; \ + inherit: "default" 0.0; \ + color: 255 255 255 64; \ + } \ + } + +#define BEAT_GENLIST_PART_DIALOGUE_ITEM \ + part { name: "elm.rect.dialogue"; \ + type: RECT; \ + scale: 1; \ + description { state: "default" 0.0; \ + min: 16 0; \ + fixed: 1 0; \ + color: 199 199 199 255; \ + rel2.relative: 0.0 1.0; \ + align: 0.0 0.0; \ + } \ + } + +#define GENLIST_GROUP_PART_BASE_EVENT_INC \ + part { name: "base_event";\ + type: RECT;\ + repeat_events: 0;\ + description { state: "default" 0.0;\ + color: 0 0 0 0;\ + }\ + } + +#define GENLIST_PADDING_10_INC 16 +#define GENLIST_HEIGHT_31_INC 49 +#define GENLIST_SIZE_30_INC 48 +#define GENLIST_FONT_20_INC 32 +#define GENLIST_GROUP_BG_COLOR_DEFAULT_INC 0 0 0 120 +#define GENLIST_GROUP_BG_COLOR_ALPHA_OFF_INC 15 15 15 255 +#define GENLIST_GROUP_PART_BASE_IMAGE_INC +#define GENLIST_GROUP_PART_TEXT_COLOR_INC 255 255 255 255 + + group { + name: "elm/genlist/item/call/grouptitle/default"; + alias: "elm/genlist/item_odd/call/grouptitle/default"; + alias: "elm/genlist/item_compress/call/grouptitle/default"; + alias: "elm/genlist/item_compress_odd/call/grouptitle/default"; + + data.item: "stacking" "above"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text"; + data.item: "treesize" "GENLIST_TREESIZE_20_INC"; + parts { + GENLIST_GROUP_PART_BASE_EVENT_INC + BEAT_GENLIST_PART_PADDING_LEFT( GENLIST_PADDING_10_INC ) + BEAT_GENLIST_PART_PADDING_RIGHT( GENLIST_PADDING_10_INC ) + part { name: "rect"; + type: RECT; + repeat_events: 1; + scale: 1; + description { state: "default" 0.0; + min: 0 GENLIST_HEIGHT_31_INC; + color: GENLIST_GROUP_BG_COLOR_DEFAULT_INC; + } + description { state: "alpha_off" 0.0; + min: 0 GENLIST_SIZE_30_INC; + color: GENLIST_GROUP_BG_COLOR_ALPHA_OFF_INC; + } + } + GENLIST_GROUP_PART_BASE_IMAGE_INC + + part { name: "elm.text"; + type: TEXT; + scale: 1; + description { state: "default" 0.0; + align: 0.0 0.5; + rel1 { + relative: 1.0 0.0; + to_x: "elm.padding.left"; + } + rel2 { + relative: 0.0 1.0; + offset: 0 0; + to_x: "elm.padding.right"; + } + color: GENLIST_GROUP_PART_TEXT_COLOR_INC; + text { + font: "SLP:style=Medium"; + size: GENLIST_FONT_20_INC; + min: 1 1; + align: 0.0 0.5; + } + } + } + } + program { + name: "enable_alpha"; + signal: "elm,state,alpha,enable"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "rect"; + } + program { + name: "disable_alpha"; + signal: "elm,state,alpha,disable"; + source: "elm"; + action: STATE_SET "alpha_off" 0.0; + target: "rect"; + } + program { + name: "selected"; + source: "rect"; + signal: "mouse,clicked,1"; + action: SIGNAL_EMIT "elm,title_action,item,click" "elm"; + } + } + + group { name: "elm/genlist/item/multicall_list/default"; + alias: "elm/genlist/item_odd/multicall_list/default"; + alias: "elm/genlist/item_compress/multicall_list/default"; + alias: "elm/genlist/item_compress_odd/multicall_list/default"; + + data.item: "stacking" "above"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text"; + data.item: "contents" "elm.swallow.end elm.swallow.private"; + data.item: "treesize" "20"; + + images { + image: "vc_conf_call_list_bg.png" COMP; + } + + parts { + BEAT_GENLIST_PART_BASE( 112 ) + BEAT_GENLIST_PART_BG + GENLIST_PART_BG_IMAGE_NO_SELECT + BEAT_GENLIST_PART_BOTTOM_LINE + BEAT_GENLIST_PART_PADDING_LEFT( 32 ) + BEAT_GENLIST_PART_PADDING_RIGHT( 16 ) + BEAT_GENLIST_PART_DIALOGUE_ITEM + + part { name: "elm.swallow.end"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + fixed: 1 0; + align: 1.0 0.5; + rel1.to_x: "elm.padding.right"; + rel2 { + relative: 0.0 1.0; + to_x: "elm.padding.right"; + } + } + } + + part { name: "elm.padding.end.left"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + min: 16 0; + fixed: 1 0; + visible: 0; + rel1.to_x: "elm.swallow.end"; + rel2 { + relative: 0.0 1.0; + to_x: "elm.swallow.end"; + } + align: 1.0 0.0; + } + } + + part { name: "elm.swallow.private"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + fixed: 1 0; + align: 1.0 0.5; + rel1.to_x: "elm.padding.end.left"; + rel2 { + relative: 0.0 1.0; + to_x: "elm.padding.end.left"; + } + } + } + + part { name: "elm.padding.private.left"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + min: 16 0; + fixed: 1 0; + visible: 0; + rel1.to_x: "elm.swallow.private"; + rel2 { + relative: 0.0 1.0; + to_x: "elm.swallow.private"; + } + align: 1.0 0.0; + } + } + + part { name: "elm.text"; + clip_to: "disclip"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + rel1 { + relative: 1.0 0.0; + offset: 0 0; + to_x: "elm.padding.left"; + } + rel2 { + relative: 0.0 1.0; + to_x: "elm.padding.private.left"; + } + color: 255 255 255 255; + text { + font: FONT_SLP_Roman; + size: 44; + min: 0 1; + align: 0.0 0.5; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; //225 225 225 255; + } + } + + BEAT_GENLIST_PART_DISCLIP + } + programs { + program { name: "go_active"; + signal: "elm,state,selected"; + source: "elm"; + action: STATE_SET "selected" 0.0; + target: "bg_image"; + target: "elm.text"; + } + program { name: "go_passive"; + signal: "elm,state,unselected"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg_image"; + target: "elm.text"; + transition: LINEAR 0.1; + } + program { name: "go_disabled"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "disclip"; + } + program { name: "go_enabled"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "disclip"; + } + } + } + +#define BEAT_GENLIST_PART_PADDING_TOP( param_padding_size ) \ + part { name: "elm.padding.top"; \ + type: RECT; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + min: 0 param_padding_size; \ + fixed: 0 1; \ + visible: 0; \ + rel2.relative: 1.0 0.0; \ + align: 0.0 0.0; \ + } \ + } + +#define BEAT_GENLIST_PART_PADDING_BOTTOM( param_padding_size ) \ + part { name: "elm.padding.bottom"; \ + type: RECT; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + min: 0 param_padding_size; \ + fixed: 0 1; \ + visible: 0; \ + rel1.relative: 0.0 1.0; \ + align: 0.0 1.0; \ + } \ + } + + ////////////// elm/button/base/text_only/title ////////////////////////////////////////////// + group { name: "elm/button/base/text_only/style_call_text_only_red_disabled"; + images { + image: "vc_button_red_normal.png" COMP; + } + parts { + part { name: "button_image"; + mouse_events: 1; + scale: 1; + effect: SOFT_SHADOW; + description { state: "default" 0.0; + min: 100 50; + image { + normal: "vc_button_red_normal.png"; + border: 16 16 0 0; + border_scale: 1; + } + color: 255 255 255 102; + } + description { state: "clicked" 0.0; + min: 100 50; + inherit: "default" 0.0; + } + description { state: "disabled" 0.0; + inherit: "clicked" 0.0; + } + description { state: "focused" 0.0; + inherit: "clicked" 0.0; + } + } + part { name: "elm.text"; + type: TEXT; + effect: SHADOW; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + fixed: 1 1; + align: 0.5 0.5; + color: 255 255 255 51; /*20%*/ + color2: 0 0 0 102; + color3: 0 0 0 255; + text { + font: FONT_SLP_Medium; + size: 48; + min: 0 0; + align: 0.5 0.5; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + description { state: "disabled_visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + } + } + part { name: "over1"; + mouse_events: 0; + description { state: "default" 0.0; + rel2.relative: 1.0 0.5; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + } + part { name: "over2"; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "over3"; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 255 255 255 0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 0; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "button_unclick"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program { name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,out"; + source: "over2"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "clicked")) + { + set_state(PART:"elm.text", "visible", 0.0); + set_state(PART:"button_image", "visible", 0.0); + } + } + } + program { name: "button_click2"; + signal: "mouse,down,1"; + source: "over3"; + action: STATE_SET "clicked" 0.0; + target: "over3"; + } + program { name: "button_unclick2"; + signal: "mouse,up,1"; + source: "over3"; + action: STATE_SET "default" 0.0; + target: "over3"; + } + program { name: "button_unclick3"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.text"; + } + + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "over1"; + target: "over2"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "disabled_visible", 0.0); + else + set_state(PART:"elm.text", "disabled", 0.0); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "over1"; + target: "over2"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "disabled_visible")) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } + + /////navigation frame///// +#define VC_NAVIFRAME_TITLE_H_INC 100 +#define VC_NAVIFRAME_OH_CLOSED_H_INC 8 +#define VC_NAVIFRAME_OH_OPENED_H_INC 106 +#define VC_NAVIFRAME_OH_CONTENT_H_INC 74 +#define VC_NAVIFRAME_OH_PADDING_INC 16 +#define VC_NAVIFRAME_OH_OPENED_DOUBLE_H_INC 196 +#define VC_NAVIFRAME_INDICATOR_W_INC 128 +#define VC_NAVIFRAME_PADDING_EXPANDED_INC 141 +#define VC_NAVIFRAME_TITLE_FONT_SIZE_INC 36 +#define VC_NAVIFRAME_ICON_SIZE_INC 32 32 +#define VC_NAVIFRAME_ICON_PADDING_INC 16 0 +#define VC_NAVIFRAME_OH_ARROW_SIZE_INC 19 14 +#define VC_NAVIFRAME_TITLE_TEXT_COLOR_INC 255 255 255 255 +#define VC_NAVIFRAME_TITLE_BG_COLOR_INC 0 0 0 0 +#define VC_NAVIFRAME_TITLE_LEFT_SEPARATOR_COLOR_INC 0 0 0 0 +#define VC_NAVIFRAME_TITLE_RIGHT_SEPARATOR_COLOR_INC 0 0 0 255 + +#define VC_NAVIFRAME_NEW_TITLE_BG_COLOR_INC 0 0 0 102 +#define VC_NAVIFRAME_BOTTOM_H_INC 114 +#define VC_NAVIFRAME_PREV_BTN_LPAD 44 +#define VC_NAVIFRAME_NEW_ICON_SIZE_INC 56 56 + +#define BUTTON_STATE_ENABLED 0 +#define BUTTON_STATE_DISABLED 1 + + group { name: "elm/naviframe/item/basic/vcui_naviframe/default"; + alias:"elm/naviframe/item/vcui_naviframe_item_1line/default"; + images { + image: "vc_reject_with_msg_control_top_arrow.png" COMP; + image: "vc_reject_with_msg_control_top_bg.png" COMP; + } + script { + public oh_show = 0; + public oh_close = 0; + } + parts { + part { name: "title_clip"; + type: RECT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: 1 VC_NAVIFRAME_TITLE_H_INC; + align: 0.0 0.0; + fixed: 0 1; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 0.0; } + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + min: 0 0; + max: 0 0; + fixed: 1 1; + } + } + part { name: "optionheader_clip"; + type: RECT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: 1 VC_NAVIFRAME_OH_CLOSED_H_INC; + align: 0.5 0; + fixed: 0 1; + rel1.to_x: "elm.swallow.content"; + rel1.to_y: "title_clip"; + rel1.relative: 0 1; + rel2.to_x: "elm.swallow.content"; + rel2.to_y: "title_clip"; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + min: 1 VC_NAVIFRAME_OH_OPENED_H_INC; + } + } + part { name: "optionheader_bg"; + type: IMAGE; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + rel1 { to: "optionheader_clip"; } + rel2 { to: "optionheader_clip"; } + image { normal: "vc_reject_with_msg_control_top_bg.png"; + border: 0 0 1 0; + } + } + } + part { name: "elm.swallow.optionheader.top.padding"; + type: SWALLOW; + scale: 1; + clip_to: "optionheader_clip"; + description { state: "default" 0.0; + min: 1 VC_NAVIFRAME_OH_PADDING_INC; + rel1 { relative: 0.0 0.0; to: "optionheader_bg"; } + rel2 { relative: 1.0 0.0; to: "optionheader_bg"; } + fixed: 0 1; + align: 0.0 0.0; + visible: 0; + } + } + part { name: "elm.swallow.optionheader"; + type: SWALLOW; + scale: 1; + clip_to: "optionheader_clip"; + description { state: "default" 0.0; + min: 1 VC_NAVIFRAME_OH_CONTENT_H_INC; + rel1 { relative: 0.0 1.0; to: "elm.swallow.optionheader.top.padding"; } + rel2 { relative: 1.0 1.0; to: "elm.swallow.optionheader.top.padding"; } + fixed: 0 1; + align: 0.0 0.0; + visible: 0; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "elm.swallow.optionheader.bottom.padding"; + type: SWALLOW; + scale: 1; + clip_to: "optionheader_clip"; + description { state: "default" 0.0; + min: 1 VC_NAVIFRAME_OH_PADDING_INC; + rel1 { relative: 0.0 1.0; to: "elm.swallow.optionheader"; } + fixed: 0 1; + align: 0.0 0.0; + visible: 0; + } + } + part { name: "content_clip"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + rel1.to_y: "optionheader_bg"; + rel1.relative: 0 1; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + repeat_events: 0; + clip_to: "content_clip"; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1.relative: 0.0 1.0; + rel1.to_y: "optionheader_bg"; + rel2.relative: 1.0 1.0; + } + description { state: "left" 0.0; + inherit: "default" 0.0; + rel1.relative: -1.0 1.0; + rel2.relative: 0.0 1.0; + } + description { state: "right" 0.0; + inherit: "default" 0.0; + rel1.relative: 1.0 1.0; + rel2.relative: 2.0 1.0; + } + } + part { name: "title_base"; + type: RECT; + clip_to: "title_clip"; + scale: 1; + description { state: "default" 0.0; + min: 1 VC_NAVIFRAME_TITLE_H_INC; + align: 0.5 0.0; + fixed: 0 1; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 0.0; } + color: VC_NAVIFRAME_TITLE_BG_COLOR_INC; + } + } + part { name: "elm.rect.pada"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: VC_NAVIFRAME_INDICATOR_W_INC 0; + fixed: 1 0; + align: 0.0 0.5; + rel1 { relative: 0.0 0.0; to: "title_base"; } + rel2 { relative: 0.0 1.0; to: "title_base"; } + visible: 0; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + min: VC_NAVIFRAME_PADDING_EXPANDED_INC 0; + } + } + part { name: "separator_1"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + align: 1.0 0; + min: 1 0; + rel1 { relative: 0.0 0.2; to:"elm.rect.padb"; to: "title_base"; } + rel2 { relative: 0.0 0.8; to:"elm.rect.padb"; to: "title_base"; } + fixed: 1 0; + color: VC_NAVIFRAME_TITLE_RIGHT_SEPARATOR_COLOR_INC; + } + } + part { name: "separator_2"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + align: 1.0 0; + min: 1 0; + rel1 { relative: 0.0 0.0; to: "separator_1"; to: "title_base"; } + rel2 { relative: 0.0 1.0; to: "separator_1"; to: "title_base"; } + fixed: 1 0; + color: VC_NAVIFRAME_TITLE_LEFT_SEPARATOR_COLOR_INC; + } + } + part { name: "elm.rect.padb"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: VC_NAVIFRAME_INDICATOR_W_INC 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 1.0 0.0; to: "title_base"; } + rel2 { relative: 1.0 1.0; to: "title_base"; } + visible: 0; + } + } + part { name: "elm.text.title"; + type: TEXT; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + text { font: "SLP:style=Medium"; + size: VC_NAVIFRAME_TITLE_FONT_SIZE_INC; + min: 0 0; + max: 1 0; + align: 0.5 0.5; + } + color: VC_NAVIFRAME_TITLE_TEXT_COLOR_INC; + align: 0.5 0.5; + rel1.to: "title_base"; + rel2.to: "title_base"; + } + } + part { name: "click_event_area"; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + rel1 { to: "title_base"; } + rel2 { to: "elm.rect.padb"; relative: 0.0 1.0; } + } + } + part { name: "elm.swallow.prev_btn"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + align: 0 0.5; + fixed: 1 1; + rel1 { relative: 0.0 0.0; to: "title_base"; } + rel2 { relative: 0.0 1.0; to: "title_base"; } + } + } + part { name: "elm.swallow.icon"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + max: VC_NAVIFRAME_ICON_SIZE_INC; + rel1 { relative: 0.0 0.0; to_x: "padding_before_text"; } + rel2 { relative: 0.0 1.0; to_x: "padding_before_text"; } + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + align: 1.0 0.5; + } + } + part { name: "padding_before_text"; + type: RECT; + scale: 1; + mouse_events: 0; + clip_to: "title_clip"; + description { state: "default" 0.0; + align: 1.0 0.5; + rel1 { relative: 0.0 0.0; to_x: "elm.text.title"; } + rel2 { relative: 0.0 1.0; to_x: "elm.text.title"; } + fixed: 1 0; + min: VC_NAVIFRAME_ICON_PADDING_INC; + visible: 0; + } + } + part { name: "optionheader_arrow"; + type: IMAGE; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: VC_NAVIFRAME_OH_ARROW_SIZE_INC; + max: VC_NAVIFRAME_OH_ARROW_SIZE_INC; + fixed: 1 1; + align: 0.5 1; + visible: 0; + rel1.to_y: "optionheader_bg"; + rel1.offset: 0 1; + rel2.relative: 1 0; + rel2.to_y: "optionheader_bg"; + rel2.offset: -1 0; + image { + normal: "vc_reject_with_msg_control_top_arrow.png"; + } + } + description { state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "content_new_pusehd"; + signal: "elm,state,new,pushed,internal"; + source: ""; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + transition: DECELERATE 0.5; + after: "show_finished"; + } + program { name: "content_cur_pusehd"; + signal: "elm,state,cur,pushed,internal"; + source: ""; + action: STATE_SET "left" 0.0; + target: "elm.swallow.content"; + transition: DECELERATE 0.5; + after: "pushed_finished"; + } + program { name: "content_prev_popped"; + signal: "elm,state,prev,popped,internal"; + source: ""; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + transition: DECELERATE 0.5; + after: "show_finished"; + } + program { name: "content_cur_popped"; + signal: "elm,state,cur,popped,internal"; + source: ""; + action: STATE_SET "right" 0.0; + target: "elm.swallow.content"; + transition: DECELERATE 0.5; + after: "popped_finished"; + } + program { name: "cur_pushed"; + signal: "elm,state,cur,pushed"; + source: "elm"; + script { + set_state(PART:"elm.swallow.content", "default", 0.0); + emit("elm,state,cur,pushed,internal", ""); + } + } + program { name: "new_pushed"; + signal: "elm,state,new,pushed"; + source: "elm"; + script { + set_state(PART:"elm.swallow.content", "right", 0.0); + emit("elm,state,new,pushed,internal", ""); + } + } + program { name: "prev_popped"; + signal: "elm,state,prev,popped"; + source: "elm"; + script { + set_state(PART:"elm.swallow.content", "left", 0.0); + emit("elm,state,prev,popped,internal", ""); + } + } + program { name: "cur_popped"; + signal: "elm,state,cur,popped"; + source: "elm"; + script { + set_state(PART:"elm.swallow.content", "default", 0.0); + emit("elm,state,cur,popped,internal", ""); + } + } + program { name: "visible"; + signal: "elm,state,visible"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { name: "title_show"; + signal: "elm,state,title,show"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "title_clip"; + } + program { name: "title_hide"; + signal: "elm,state,title,hide"; + source: "elm"; + action: STATE_SET "hide" 0.0; + target: "title_clip"; + } + program { name: "optionheader_show"; + signal: "elm,state,elm.swallow.optionheader,show"; + source: "elm"; + script { + set_state(PART:"optionheader_clip", "show", 0.0); + set_state(PART:"optionheader_arrow", "show", 0.0); + set_state(PART:"elm.swallow.optionheader", "show", 0.0); + set_int(oh_show, 1); + emit("elm,state,optionheader_arrow,show", ""); + } + } + program { name: "optionheader_hide"; + signal: "elm,state,elm.swallow.optionheader,hide"; + source: "elm"; + script { + set_state(PART:"optionheader_clip", "default", 0.0); + set_state(PART:"optionheader_arrow", "default", 0.0); + set_state(PART:"elm.swallow.optionheader", "default", 0.0); + set_int(oh_show, 0); + } + } + program { name: "optionheader_open"; + signal: "elm,state,optionheader,open"; + source: ""; + action: STATE_SET "show" 0.0; + target: "optionheader_clip"; + target: "elm.swallow.optionheader"; + transition: LINEAR 0.2; + after: "optionheader_open_set"; + } + program { name: "optionheader_close"; + signal: "elm,state,optionheader,close"; + source: ""; + action: STATE_SET "default" 0.0; + target: "optionheader_clip"; + target: "elm.swallow.optionheader"; + transition: LINEAR 0.2; + after: "optionheader_close_set"; + } + program { name: "optionheader_instant_open"; + signal: "elm,state,optionheader,instant_open"; + source: ""; + action: STATE_SET "show" 0.0; + target: "optionheader_clip"; + target: "elm.swallow.optionheader"; + after: "optionheader_open_set"; + } + program { name: "optionheader_instant_close"; + signal: "elm,state,optionheader,instant_close"; + source: ""; + action: STATE_SET "default" 0.0; + target: "optionheader_clip"; + target: "elm.swallow.optionheader"; + after: "optionheader_close_set"; + } + program { name: "optionheader_close_set"; + signal: "elm,state,optionheader,close_set"; + source: ""; + script { + set_int(oh_close, 1); + } + } + program { name: "optionheader_open_set"; + signal: "elm,state,optionheader,open_set"; + source: ""; + script { + set_int(oh_close, 0); + } + } + program { name: "show_finished"; + action: SIGNAL_EMIT "elm,action,show,finished" ""; + } + program { name: "pushed_finished"; + action: SIGNAL_EMIT "elm,action,pushed,finished" ""; + } + program { name: "popped_finished"; + action: SIGNAL_EMIT "elm,action,popped,finished" ""; + } + program { name: "title_clicked_signal"; + action: SIGNAL_EMIT "elm,action,title,clicked" ""; + } + program { + name: "title_clicked"; + signal: "mouse,clicked,1"; + source: "click_event_area"; + script { + if (get_int(oh_show) == 1) { + if (get_int(oh_close) == 1) { + emit("elm,state,optionheader,open", ""); + }else { + emit("elm,state,optionheader,close", ""); + } + } + } + after: "title_clicked_signal"; + } + } + } + + group { name: "elm/naviframe/item/basic/vcui_naviframe_new/default"; + alias:"elm/naviframe/item/vcui_naviframe_new_item_1line/default"; + parts { + part { name: "title_clip"; + type: RECT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: 1 VC_NAVIFRAME_TITLE_H_INC; + align: 0.0 0.0; + fixed: 0 1; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 0.0; } + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + min: 0 0; + max: 0 0; + fixed: 1 1; + } + } + part { name: "title_base"; + type: RECT; + clip_to: "title_clip"; + scale: 1; + description { state: "default" 0.0; + min: 1 VC_NAVIFRAME_TITLE_H_INC; + align: 0.5 0.0; + fixed: 0 1; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 0.0; } + color: VC_NAVIFRAME_NEW_TITLE_BG_COLOR_INC; + } + } + part { name: "elm.text.title"; + type: TEXT; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + text { font: "SLP:style=Medium"; + size: VC_NAVIFRAME_TITLE_FONT_SIZE_INC; + min: 0 0; + max: 1 0; + align: 0.5 0.5; + } + color: VC_NAVIFRAME_TITLE_TEXT_COLOR_INC; + align: 0.5 0.5; + rel1.to: "title_base"; + rel2.to: "title_base"; + } + } + part { name: "click_event_area"; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + rel1 { to: "title_base"; } + rel2 { to: "title_base"; } + } + } + part { name: "bottom_clip"; + type: RECT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: 1 VC_NAVIFRAME_BOTTOM_H_INC; + align: 0.0 0.0; + fixed: 0 1; + rel1 { relative: 0.0 (1166/1280); } + rel2 { relative: 1.0 1.0; } + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + min: 0 0; + max: 0 0; + fixed: 1 1; + } + } + part { name: "bottom_base"; + type: RECT; + clip_to: "bottom_clip"; + scale: 1; + description { state: "default" 0.0; + min: 1 VC_NAVIFRAME_BOTTOM_H_INC; + align: 0.5 0.0; + fixed: 0 1; + rel1 { relative: 0.0 0.0; to: "bottom_clip"; } + rel2 { relative: 1.0 1.0; to: "bottom_clip"; } + color: VC_NAVIFRAME_NEW_TITLE_BG_COLOR_INC; + } + } + part { name: "elm.swallow.prev_btn"; + type: SWALLOW; + scale: 1; + clip_to: "bottom_clip"; + description { state: "default" 0.0; + align: 0.0 0.5; + fixed: 1 1; + rel1 { relative: 0.0 0.0; to: "bottom_base"; } + rel2 { relative: 0.0 1.0; to: "bottom_base"; } + } + } + part { name: "elm.swallow.icon"; + type: SWALLOW; + scale: 1; + clip_to: "bottom_clip"; + description { state: "default" 0.0; + max: VC_NAVIFRAME_NEW_ICON_SIZE_INC; + rel1 { relative: 0.0 0.0; to_x: "padding_before_prevbtn"; } + rel2 { relative: 0.0 1.0; to_x: "padding_before_prevbtn"; } + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + align: 1.0 0.5; + } + } + part { name: "padding_before_prevbtn"; + type: RECT; + scale: 1; + mouse_events: 0; + clip_to: "bottom_clip"; + description { state: "default" 0.0; + min: VC_NAVIFRAME_PREV_BTN_LPAD 0; + align: 1.0 0.5; + rel1 { relative: 0.0 0.0; to_x: "bottom_clip"; } + rel2 { relative: 0.0 1.0; to_x: "bottom_clip"; } + fixed: 1 0; + visible: 0; + } + } + } + programs { + program { name: "title_show"; + signal: "elm,state,title,show"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "title_clip"; + target: "bottom_clip"; + } + program { name: "title_hide"; + signal: "elm,state,title,hide"; + source: "elm"; + action: STATE_SET "hide" 0.0; + target: "title_clip"; + target: "bottom_clip"; + } + program { name: "show_finished"; + action: SIGNAL_EMIT "elm,action,show,finished" ""; + } + program { name: "pushed_finished"; + action: SIGNAL_EMIT "elm,action,pushed,finished" ""; + } + program { name: "popped_finished"; + action: SIGNAL_EMIT "elm,action,popped,finished" ""; + } + program { name: "title_clicked_signal"; + action: SIGNAL_EMIT "elm,action,title,clicked" ""; + } + program { + name: "title_clicked"; + signal: "mouse,clicked,1"; + source: "click_event_area"; + after: "title_clicked_signal"; + } + } + } + + group { name: "elm/button/base/vcui_naviframe_control/left"; + script { + public button_state = BUTTON_STATE_ENABLED; + } + images.image: "vc_reject_with_msg_option_header_bt_press.png" COMP; + parts { + part { name: "button_image"; + type: IMAGE; + mouse_events: 1; + scale: 1; + description { state: "default" 0.0; + min: 20 20; + color: 0 0 0 0; + rel1.offset: 0 0; + rel2.offset: -1 -1; + color: 255 255 255 255; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + image.normal: "vc_reject_with_msg_option_header_bt_press.png"; + } + } + part { + name: "padding_left_top"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 0.0 0.0; + min: 10 5; + fixed: 1 1; + visible: 0; + } + } + part { + name: "padding_right_bottom"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 1.0 1.0; + rel1.relative: 1.0 1.0; + rel2.relative: 1.0 1.0; + min: 10 5; + fixed: 1 1; + visible: 0; + } + } + part { + name: "icon_rect"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + min: 0 0; + fixed: 1 0; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + align: 0.0 0.5; + color: 0 0 0 0; + } + description { state: "visible" 0.0; + visible: 1; + min: 22 22; + fixed: 1 0; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + align: 0.0 0.5; + color: 0 0 0 0; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_after_icon"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1 { relative: 1.0 0.0; to: "icon_rect"; } + rel2 { relative: 1.0 1.0; to: "icon_rect"; } + fixed: 1 0; + min: 0 0; + color: 0 0 0 0; + } + description { state: "visible" 0.0; + visible: 1; + align: 0.0 0.0; + rel1 { relative: 1.0 0.0; to: "icon_rect"; } + rel2 { relative: 1.0 1.0; to: "icon_rect"; } + fixed: 1 0; + min: 6 0; + color: 0 0 0 0; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_before_text"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 1.0 0.5; + rel1 { relative: 0.0 1.0; to_x: "elm.text"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to_x: "elm.text"; to_y: "padding_right_bottom"; } + fixed: 1 0; + min: 6 0; + color: 0 0 0 0; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + clip_to: "disabler"; + description { state: "default" 0.0; + visible: 0; + align: 0.0 0.5; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + fixed: 1 0; + } + description { state: "visible" 0.0; + fixed: 1 0; + visible: 1; + min: 22 22; + max: 22 22; + align: 1.0 0.5; + rel1 { relative: 0.0 1.0; to_x: "padding_before_text"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to_x: "padding_before_text"; to_y: "padding_right_bottom"; } + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + } + description { state: "icononly" 0.0; + visible: 1; + min: 30 30; + max: 30 30; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to: "padding_right_bottom"; } + align: 0.5 0.5; + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + } + } + part { name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + clip_to: "disabler"; + description { state: "default" 0.0; + visible: 0; + rel1 { relative: 1.0 1.0; to_x: "padding_after_icon"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to: "padding_right_bottom"; } + align: 0.0 0.5; + color: 255 255 255 255; + text { + font: FONT_SLP_Medium; + size: 32; + min: 0 0; + align: 0.0 0.5; + max: 1 0; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 0 0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 0 0; + color: 255 255 255 255; + } + } + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + color: 0 0 0 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 255 255 255 255; + } + description { state: "disabled" 0.0; + color: 255 255 255 127; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + after: "text_clicked"; + } + program { name: "text_clicked"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "clicked", 0.0); + } + } + program { name: "button_unpress"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,up,1"; + source: "over3"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (strcmp(st, "icononly")) + { + emit("elm,action,default,text,set", ""); + set_state(PART:"elm.text", "visible", 0.0); + } + if(get_int(button_state) != BUTTON_STATE_DISABLED) + set_state(PART:"button_image", "default", 0.0); + } + after: button_unpress; + } + program { name: "button_click2"; + signal: "mouse,down,1"; + source: "over3"; + action: STATE_SET "clicked" 0.0; + target: "over3"; + } + program { name: "button_unclick2"; + signal: "mouse,clicked,1"; + source: "over3"; + action: STATE_SET "default" 0.0; + target: "over3"; + } + program { name: "button_unclick3"; + signal: "mouse,clicked,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "icononly")) + { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"icon_rect", "visible", 0.0); + set_state(PART:"padding_after_icon", "visible", 0.0); + } + set_state(PART:"elm.text", "visible", 0.0); + } + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "visible")) + { + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"icon_rect", "icononly", 0.0); + set_state(PART:"padding_after_icon", "icononly", 0.0); + } + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "icon_show"; + signal: "elm,state,icon,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"icon_rect", "visible", 0.0); + set_state(PART:"padding_after_icon", "visible", 0.0); + } + else + { + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"icon_rect", "icononly", 0.0); + set_state(PART:"padding_after_icon", "icononly", 0.0); + } + } + } + program { name: "icon_hide"; + signal: "elm,state,icon,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "over2"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + set_int(button_state, BUTTON_STATE_DISABLED); + set_state(PART:"elm.text", "visible", 0.0); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "over2"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + set_int(button_state, BUTTON_STATE_ENABLED); + set_state(PART:"elm.text", "visible", 0.0); + } + } + program { name: "focused"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + action: STATE_SET "default" 0.0; + target: "button_image"; + after: "unfocus_text"; + } + program { name: "unfocus_text"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } + + group { name: "elm/button/base/vcui_naviframe_backbutton/default"; + //TODO: Remove this alias later + alias: "elm/button/base/vcui_naviframe_backbutton/default"; + images { + image: "vc_control_btn_prev.png" COMP; + } + parts { + part { name: "button_image"; + type: RECT; + mouse_events: 1; + scale: 1; + description { state: "default" 0.0; + min: 106 40; + color: 0 0 0 0; + } + description { + state: "clicked" 0.0; + inherit: "default" 0.0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + } + } + part {name: "padding_right"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + align: 1 0; + min: 1 0; + rel1 { relative: 1 0.2; } + rel2 { relative: 1 0.8; } + fixed: 1 0; + color: VC_NAVIFRAME_TITLE_RIGHT_SEPARATOR_COLOR_INC; + } + } + part {name: "padding_before_right"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + align: 1 0; + min: 1 0; + rel1 { relative: 0 0; to: "padding_right"; } + rel2 { relative: 0 1; to: "padding_right"; } + fixed: 1 0; + color: VC_NAVIFRAME_TITLE_LEFT_SEPARATOR_COLOR_INC; + } + } + part { name: "button_center_part"; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: 36 32; + max: 36 32; + align: 0.5 0.5; + rel2 { relative: 0 1; to_x: "padding_before_right"; } + image { + normal: "vc_control_btn_prev.png"; + } + } + description { + state: "clicked" 0.0; + inherit: "default" 0.0; + } + } + part { name: "over1"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "over2"; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over1"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + target: "button_center_part"; + } + program { name: "button_unclick"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program { name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "button_center_part"; + } + program { name: "button_unclick2"; + signal: "mouse,clicked,1"; + source: "over1"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "disabler"; + target: "button_image"; + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "disabler"; + target: "button_image"; + } + } + } + + group { name: "elm/button/base/vcui_naviframe_new_backbutton/default"; + //TODO: Remove this alias later + alias: "elm/button/base/vcui_naviframe_new_backbutton/default"; + images { + image: "vc_control_btn_new_prev.png" COMP; + } + parts { + part { name: "button_image"; + type: RECT; + mouse_events: 1; + scale: 1; + description { state: "default" 0.0; + min: 100 114; + color: 0 0 0 0; + } + description { + state: "clicked" 0.0; + inherit: "default" 0.0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + } + } + part {name: "padding_right"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + align: 1 0; + min: 1 0; + rel1 { relative: 1 0.2; } + rel2 { relative: 1 0.8; } + fixed: 1 0; + color: VC_NAVIFRAME_TITLE_RIGHT_SEPARATOR_COLOR_INC; + } + } + part {name: "padding_before_right"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + align: 1 0; + min: 1 0; + rel1 { relative: 0 0; to: "padding_right"; } + rel2 { relative: 0 1; to: "padding_right"; } + fixed: 1 0; + color: VC_NAVIFRAME_TITLE_LEFT_SEPARATOR_COLOR_INC; + } + } + part { name: "button_center_part"; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: VC_NAVIFRAME_NEW_ICON_SIZE_INC; + max: VC_NAVIFRAME_NEW_ICON_SIZE_INC; + align: 0.5 0.5; + rel2 { relative: 0 1; to_x: "padding_before_right"; } + image { + normal: "vc_control_btn_new_prev.png"; + } + } + description { + state: "clicked" 0.0; + inherit: "default" 0.0; + } + } + part { name: "over1"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "over2"; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over1"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + target: "button_center_part"; + } + program { name: "button_unclick"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program { name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "button_center_part"; + } + program { name: "button_unclick2"; + signal: "mouse,clicked,1"; + source: "over1"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "disabler"; + target: "button_image"; + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "disabler"; + target: "button_image"; + } + } + } + +/////////////////////////////////////////////////////////////////////////////////////// + group { name: "elm/button/base/style_call_lscape_join"; + images { + image: "vc_six_btn_layout_normal.png" COMP; + image: "vc_six_btn_layout_press.png" COMP; + } + script { + public button_state = BUTTON_STATE_ENABLED; + } + parts { + part { name: "button_image"; + mouse_events: 1; + scale: 1; + description { state: "default" 0.0; + min: 20 46; + image { + normal: "vc_six_btn_layout_normal.png"; + border: 9 9 0 0; + border_scale: 1; + } + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + image.normal: "vc_six_btn_layout_press.png"; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_left_top"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 0.0 0.0; + min: 10 5; + fixed: 1 1; + visible: 0; + } + } + part { + name: "padding_right_bottom"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 1.0 1.0; + rel1.relative: 1.0 1.0; + rel2.relative: 1.0 1.0; + min: 10 5; + fixed: 1 1; + visible: 0; + } + } + part { + name: "icon_rect"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + min: 0 0; + fixed: 1 0; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + align: 0.0 0.5; + color: 0 0 0 0; + } + description { state: "visible" 0.0; + visible: 1; + min: 26 28; + max: 26 28; + fixed: 1 0; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + align: 0.0 0.5; + color: 0 0 0 0; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_after_icon"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; //when only icon or no icon is there + align: 0.0 0.0; + rel1 { relative: 1.0 0.0; to: "icon_rect"; } + rel2 { relative: 1.0 1.0; to: "icon_rect"; } + fixed: 1 0; + min: 0 0; + color: 0 255 0 100; + } + description { state: "visible" 0.0; + visible: 1; + align: 0.0 0.0; + rel1 { relative: 1.0 0.0; to: "icon_rect"; } + rel2 { relative: 1.0 1.0; to: "icon_rect"; } + fixed: 1 0; + min: 10 0; + color: 0 0 0 0; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_before_text"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; //when only icon or no icon is there + align: 1.0 0.5; + rel1 { relative: 0.0 1.0; to_x: "elm.text"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to_x: "elm.text"; to_y: "padding_right_bottom"; } + fixed: 1 0; + min: 10 0; + color: 0 0 0 0; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + visible: 0; + align: 0.0 0.5; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + fixed: 1 0; + } + description { state: "visible" 0.0; + fixed: 1 0; + visible: 1; + min: 26 28; + max: 26 28; + align: 1.0 0.5; + rel1 { relative: 0.0 1.0; to_x: "padding_before_text"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to_x: "padding_before_text"; to_y: "padding_right_bottom"; } + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + } + description { state: "icononly" 0.0; + visible: 1; + min: 26 28; + max: 26 28; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + align: 0.5 0.5; + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + } + } + part { name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + visible: 0; + rel1 { relative: 1.0 1.0; to_x: "padding_after_icon"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to: "padding_right_bottom"; } + align: 0.5 0.5; + text { + font: "SLP:style=Medium"; + size: 32; + min: 0 0; + align: 0.5 0.5; + max: 1 0; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 90 28; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 0 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + } + description { state: "disabled_visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 90 28; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 0 0; + } + } + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + after: "text_clicked"; + } + program { name: "text_clicked"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "clicked", 0.0); + } + } + program { name: "button_unpress"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,up,1"; + source: "over3"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (strcmp(st, "icononly")) + { + emit("elm,action,default,text,set", ""); + set_state(PART:"elm.text", "visible", 0.0); + } + if(get_int(button_state) != BUTTON_STATE_DISABLED) + set_state(PART:"button_image", "default", 0.0); + } + after: button_unpress; + } + program { name: "button_unclick3"; + signal: "mouse,clicked,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "icononly")) + { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"icon_rect", "visible", 0.0); + set_state(PART:"padding_after_icon", "visible", 0.0); + } + if(get_int(button_state) != BUTTON_STATE_DISABLED) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "disabled_visible", 0.0); + } + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "visible")) + { + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"icon_rect", "icononly", 0.0); + set_state(PART:"padding_after_icon", "icononly", 0.0); + } + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "icon_show"; + signal: "elm,state,icon,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"icon_rect", "visible", 0.0); + set_state(PART:"padding_after_icon", "visible", 0.0); + } + else + { + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"icon_rect", "icononly", 0.0); + set_state(PART:"padding_after_icon", "icononly", 0.0); + } + } + } + program { name: "icon_hide"; + signal: "elm,state,icon,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "disabled_visible", 0.0); + else + set_state(PART:"elm.text", "disabled", 0.0); + set_int(button_state, BUTTON_STATE_DISABLED); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "disabled_visible")) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "default", 0.0); + set_int(button_state, BUTTON_STATE_ENABLED); + } + } + program { name: "focused"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + action: STATE_SET "default" 0.0; + target: "button_image"; + after: "unfocus_text"; + } + program { name: "unfocus_text"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } + +/////////////////////////////////////////////////////////////////////////////////////// + group { name: "elm/button/base/style_call_lscape_join_disabled"; + images { + image: "vc_six_btn_layout_normal.png" COMP; + } + script { + public button_state = BUTTON_STATE_ENABLED; + } + parts { + part { name: "button_image"; + mouse_events: 1; + scale: 1; + description { state: "default" 0.0; + min: 20 46; + image { + normal: "vc_six_btn_layout_normal.png"; + border: 9 9 0 0; + border_scale: 1; + } + color: 255 255 255 102; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_left_top"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 0.0 0.0; + min: 10 5; + fixed: 1 1; + visible: 0; + } + } + part { + name: "padding_right_bottom"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 1.0 1.0; + rel1.relative: 1.0 1.0; + rel2.relative: 1.0 1.0; + min: 10 5; + fixed: 1 1; + visible: 0; + } + } + part { + name: "icon_rect"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + min: 0 0; + fixed: 1 0; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + align: 0.0 0.5; + color: 0 0 0 0; + } + description { state: "visible" 0.0; + visible: 1; + min: 26 28; + max: 26 28; + fixed: 1 0; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + align: 0.0 0.5; + color: 0 0 0 0; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_after_icon"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1 { relative: 1.0 0.0; to: "icon_rect"; } + rel2 { relative: 1.0 1.0; to: "icon_rect"; } + fixed: 1 0; + min: 0 0; + color: 0 255 0 100; + } + description { state: "visible" 0.0; + visible: 1; + align: 0.0 0.0; + rel1 { relative: 1.0 0.0; to: "icon_rect"; } + rel2 { relative: 1.0 1.0; to: "icon_rect"; } + fixed: 1 0; + min: 10 0; + color: 0 0 0 0; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_before_text"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 1.0 0.5; + rel1 { relative: 0.0 1.0; to_x: "elm.text"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to_x: "elm.text"; to_y: "padding_right_bottom"; } + fixed: 1 0; + min: 10 0; + color: 0 0 0 0; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + visible: 0; + align: 0.0 0.5; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + fixed: 1 0; + } + description { state: "visible" 0.0; + fixed: 1 0; + visible: 1; + min: 26 28; + max: 26 28; + align: 1.0 0.5; + rel1 { relative: 0.0 1.0; to_x: "padding_before_text"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to_x: "padding_before_text"; to_y: "padding_right_bottom"; } + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + } + description { state: "icononly" 0.0; + visible: 1; + min: 26 28; + max: 26 28; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + align: 0.5 0.5; + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + } + } + part { name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + visible: 0; + rel1 { relative: 1.0 1.0; to_x: "padding_after_icon"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to: "padding_right_bottom"; } + align: 0.5 0.5; + color: 255 255 255 51; /*20%*/ + text { + font: "SLP:style=Medium"; + size: 32; + min: 0 0; + align: 0.5 0.5; + max: 1 0; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 90 28; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 0 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + } + description { state: "disabled_visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 90 28; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 0 0; + } + } + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + after: "text_clicked"; + } + program { name: "text_clicked"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "clicked", 0.0); + } + } + program { name: "button_unpress"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,up,1"; + source: "over3"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (strcmp(st, "icononly")) + { + emit("elm,action,default,text,set", ""); + set_state(PART:"elm.text", "visible", 0.0); + } + if(get_int(button_state) != BUTTON_STATE_DISABLED) + set_state(PART:"button_image", "default", 0.0); + } + after: button_unpress; + } + program { name: "button_unclick3"; + signal: "mouse,clicked,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "icononly")) + { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"icon_rect", "visible", 0.0); + set_state(PART:"padding_after_icon", "visible", 0.0); + } + if(get_int(button_state) != BUTTON_STATE_DISABLED) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "disabled_visible", 0.0); + } + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "visible")) + { + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"icon_rect", "icononly", 0.0); + set_state(PART:"padding_after_icon", "icononly", 0.0); + } + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "icon_show"; + signal: "elm,state,icon,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"icon_rect", "visible", 0.0); + set_state(PART:"padding_after_icon", "visible", 0.0); + } + else + { + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"icon_rect", "icononly", 0.0); + set_state(PART:"padding_after_icon", "icononly", 0.0); + } + } + } + program { name: "icon_hide"; + signal: "elm,state,icon,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "disabled_visible", 0.0); + else + set_state(PART:"elm.text", "disabled", 0.0); + set_int(button_state, BUTTON_STATE_DISABLED); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "disabled_visible")) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "default", 0.0); + set_int(button_state, BUTTON_STATE_ENABLED); + } + } + program { name: "focused"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + action: STATE_SET "default" 0.0; + target: "button_image"; + after: "unfocus_text"; + } + program { name: "unfocus_text"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } + +/////////////////////////////////////////////////////////////////////////////////////// + group { name: "elm/button/base/style_call_lscape_endcall_red"; + images { + image: "vc_button_red_normal.png" COMP; + image: "vc_button_press.png" COMP; + } + script { + public button_state = BUTTON_STATE_ENABLED; + } + parts { + part { name: "button_image"; + mouse_events: 1; + scale: 1; + description { state: "default" 0.0; + min: 20 46; + image { + normal: "vc_button_red_normal.png"; + border: 16 16 0 0; + border_scale: 1; + } + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + image.normal: "vc_button_press.png"; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + image.normal: "vc_button_press.png"; + } + } + part { + name: "padding_left_top"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 0.0 0.0; + min: 10 5; + fixed: 1 1; + visible: 0; + } + } + part { + name: "padding_right_bottom"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 1.0 1.0; + rel1.relative: 1.0 1.0; + rel2.relative: 1.0 1.0; + min: 10 5; + fixed: 1 1; + visible: 0; + } + } + part { + name: "icon_rect"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + min: 0 0; + fixed: 1 0; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + align: 0.0 0.5; + color: 0 0 0 0; + } + description { state: "visible" 0.0; + visible: 1; + min: 40 40; + max: 40 40; + fixed: 1 0; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + align: 0.0 0.5; + color: 0 0 0 0; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_after_icon"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1 { relative: 1.0 0.0; to: "icon_rect"; } + rel2 { relative: 1.0 1.0; to: "icon_rect"; } + fixed: 1 0; + min: 0 0; + color: 0 255 0 100; + } + description { state: "visible" 0.0; + visible: 1; + align: 0.0 0.0; + rel1 { relative: 1.0 0.0; to: "icon_rect"; } + rel2 { relative: 1.0 1.0; to: "icon_rect"; } + fixed: 1 0; + min: 10 0; + color: 0 0 0 0; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_before_text"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 1.0 0.5; + rel1 { relative: 0.0 1.0; to_x: "elm.text"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to_x: "elm.text"; to_y: "padding_right_bottom"; } + fixed: 1 0; + min: 10 0; + color: 0 0 0 0; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + visible: 0; + align: 0.0 0.5; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + fixed: 1 0; + } + description { state: "visible" 0.0; + fixed: 1 0; + visible: 1; + min: 40 40; + max: 40 40; + align: 1.0 0.5; + rel1 { relative: 0.0 1.0; to_x: "padding_before_text"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to_x: "padding_before_text"; to_y: "padding_right_bottom"; } + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + } + description { state: "icononly" 0.0; + visible: 1; + min: 40 40; + max: 40 40; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + align: 0.5 0.5; + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + } + } + part { name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + visible: 0; + rel1 { relative: 1.0 1.0; to_x: "padding_after_icon"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to: "padding_right_bottom"; } + align: 0.5 0.5; + text { + font: "SLP:style=Medium"; + size: 32; + min: 0 0; + align: 0.5 0.5; + max: 1 0; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 90 40; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 0 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + color: 255 255 255 51; /*20%*/ + } + description { state: "disabled_visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 90 40; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 0 0; + } + } + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + after: "text_clicked"; + } + program { name: "text_clicked"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "clicked", 0.0); + } + } + program { name: "button_unpress"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,up,1"; + source: "over3"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (strcmp(st, "icononly")) + { + emit("elm,action,default,text,set", ""); + set_state(PART:"elm.text", "visible", 0.0); + } + if(get_int(button_state) != BUTTON_STATE_DISABLED) + set_state(PART:"button_image", "default", 0.0); + } + after: button_unpress; + } + program { name: "button_unclick3"; + signal: "mouse,clicked,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "icononly")) + { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"icon_rect", "visible", 0.0); + set_state(PART:"padding_after_icon", "visible", 0.0); + } + if(get_int(button_state) != BUTTON_STATE_DISABLED) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "disabled_visible", 0.0); + } + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "visible")) + { + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"icon_rect", "icononly", 0.0); + set_state(PART:"padding_after_icon", "icononly", 0.0); + } + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "icon_show"; + signal: "elm,state,icon,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"icon_rect", "visible", 0.0); + set_state(PART:"padding_after_icon", "visible", 0.0); + } + else + { + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"icon_rect", "icononly", 0.0); + set_state(PART:"padding_after_icon", "icononly", 0.0); + } + } + } + program { name: "icon_hide"; + signal: "elm,state,icon,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "disabled_visible", 0.0); + else + set_state(PART:"elm.text", "disabled", 0.0); + set_int(button_state, BUTTON_STATE_DISABLED); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "disabled_visible")) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "default", 0.0); + set_int(button_state, BUTTON_STATE_ENABLED); + } + } + program { name: "focused"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + action: STATE_SET "default" 0.0; + target: "button_image"; + after: "unfocus_text"; + } + program { name: "unfocus_text"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } + +/////////////////////////////////////////////////////////////////////////////////////// + group { name: "elm/button/base/style_call_lscape_endcall_red_disabled"; + images { + image: "vc_button_red_normal.png" COMP; + } + script { + public button_state = BUTTON_STATE_ENABLED; + } + parts { + part { name: "button_image"; + mouse_events: 1; + scale: 1; + description { state: "default" 0.0; + min: 20 46; + image { + normal: "vc_button_red_normal.png"; + border: 16 16 0 0; + border_scale: 1; + } + color: 255 255 255 102; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_left_top"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 0.0 0.0; + min: 10 5; + fixed: 1 1; + visible: 0; + } + } + part { + name: "padding_right_bottom"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 1.0 1.0; + rel1.relative: 1.0 1.0; + rel2.relative: 1.0 1.0; + min: 10 5; + fixed: 1 1; + visible: 0; + } + } + part { + name: "icon_rect"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + min: 0 0; + fixed: 1 0; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + align: 0.0 0.5; + color: 0 0 0 0; + } + description { state: "visible" 0.0; + visible: 1; + min: 40 40; + max: 40 40; + fixed: 1 0; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + align: 0.0 0.5; + color: 0 0 0 0; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_after_icon"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1 { relative: 1.0 0.0; to: "icon_rect"; } + rel2 { relative: 1.0 1.0; to: "icon_rect"; } + fixed: 1 0; + min: 0 0; + color: 0 255 0 100; + } + description { state: "visible" 0.0; + visible: 1; + align: 0.0 0.0; + rel1 { relative: 1.0 0.0; to: "icon_rect"; } + rel2 { relative: 1.0 1.0; to: "icon_rect"; } + fixed: 1 0; + min: 10 0; + color: 0 0 0 0; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_before_text"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 1.0 0.5; + rel1 { relative: 0.0 1.0; to_x: "elm.text"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to_x: "elm.text"; to_y: "padding_right_bottom"; } + fixed: 1 0; + min: 10 0; + color: 0 0 0 0; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + visible: 0; + align: 0.0 0.5; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + fixed: 1 0; + } + description { state: "visible" 0.0; + fixed: 1 0; + visible: 1; + min: 40 40; + max: 40 40; + align: 1.0 0.5; + rel1 { relative: 0.0 1.0; to_x: "padding_before_text"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to_x: "padding_before_text"; to_y: "padding_right_bottom"; } + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + } + description { state: "icononly" 0.0; + visible: 1; + min: 40 40; + max: 40 40; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + align: 0.5 0.5; + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + } + } + part { name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + visible: 0; + rel1 { relative: 1.0 1.0; to_x: "padding_after_icon"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to: "padding_right_bottom"; } + align: 0.5 0.5; + color: 255 255 255 51; /*20%*/ + text { + font: "SLP:style=Medium"; + size: 32; + min: 0 0; + align: 0.5 0.5; + max: 1 0; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 90 40; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 0 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + } + description { state: "disabled_visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 90 40; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 0 0; + } + } + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + after: "text_clicked"; + } + program { name: "text_clicked"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "clicked", 0.0); + } + } + program { name: "button_unpress"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,up,1"; + source: "over3"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (strcmp(st, "icononly")) + { + emit("elm,action,default,text,set", ""); + set_state(PART:"elm.text", "visible", 0.0); + } + if(get_int(button_state) != BUTTON_STATE_DISABLED) + set_state(PART:"button_image", "default", 0.0); + } + after: button_unpress; + } + program { name: "button_unclick3"; + signal: "mouse,clicked,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "icononly")) + { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"icon_rect", "visible", 0.0); + set_state(PART:"padding_after_icon", "visible", 0.0); + } + if(get_int(button_state) != BUTTON_STATE_DISABLED) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "disabled_visible", 0.0); + } + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "visible")) + { + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"icon_rect", "icononly", 0.0); + set_state(PART:"padding_after_icon", "icononly", 0.0); + } + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "icon_show"; + signal: "elm,state,icon,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"icon_rect", "visible", 0.0); + set_state(PART:"padding_after_icon", "visible", 0.0); + } + else + { + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"icon_rect", "icononly", 0.0); + set_state(PART:"padding_after_icon", "icononly", 0.0); + } + } + } + program { name: "icon_hide"; + signal: "elm,state,icon,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "disabled_visible", 0.0); + else + set_state(PART:"elm.text", "disabled", 0.0); + set_int(button_state, BUTTON_STATE_DISABLED); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "disabled_visible")) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "default", 0.0); + set_int(button_state, BUTTON_STATE_ENABLED); + } + } + program { name: "focused"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + action: STATE_SET "default" 0.0; + target: "button_image"; + after: "unfocus_text"; + } + program { name: "unfocus_text"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } + +/////////////////////////////////////////////////////////////////////////////////////// + group { name: "elm/button/base/style_call_lscape_split"; + images { + image: "vc_conference_call_btn_normal.png" COMP; + image: "vc_conference_call_btn_press.png" COMP; + } + script { + public button_state = BUTTON_STATE_ENABLED; + } + parts { + part { name: "button_image"; + mouse_events: 1; + scale: 1; + description { state: "default" 0.0; + min: 20 46; + image { + normal: "vc_conference_call_btn_normal.png"; + border: 5 5 0 0; + border_scale: 1; + } + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + image.normal: "vc_conference_call_btn_press.png"; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_left_top"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 0.0 0.0; + min: 10 5; + fixed: 1 1; + visible: 0; + } + } + part { + name: "padding_right_bottom"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 1.0 1.0; + rel1.relative: 1.0 1.0; + rel2.relative: 1.0 1.0; + min: 10 5; + fixed: 1 1; + visible: 0; + } + } + part { + name: "icon_rect"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + min: 0 0; + fixed: 1 0; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + align: 0.0 0.5; + color: 0 0 0 0; + } + description { state: "visible" 0.0; + visible: 1; + min: 52 35; + max: 52 35; + fixed: 1 0; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + align: 0.0 0.5; + color: 0 0 0 0; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_after_icon"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1 { relative: 1.0 0.0; to: "icon_rect"; } + rel2 { relative: 1.0 1.0; to: "icon_rect"; } + fixed: 1 0; + min: 0 0; + color: 0 255 0 100; + } + description { state: "visible" 0.0; + visible: 1; + align: 0.0 0.0; + rel1 { relative: 1.0 0.0; to: "icon_rect"; } + rel2 { relative: 1.0 1.0; to: "icon_rect"; } + fixed: 1 0; + min: 10 0; + color: 0 0 0 0; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_before_text"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 1.0 0.5; + rel1 { relative: 0.0 1.0; to_x: "elm.text"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to_x: "elm.text"; to_y: "padding_right_bottom"; } + fixed: 1 0; + min: 10 0; + color: 0 0 0 0; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + visible: 0; + align: 0.0 0.5; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + fixed: 1 0; + } + description { state: "visible" 0.0; + fixed: 1 0; + visible: 1; + min: 52 35; + max: 52 35; + align: 1.0 0.5; + rel1 { relative: 0.0 1.0; to_x: "padding_before_text"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to_x: "padding_before_text"; to_y: "padding_right_bottom"; } + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + } + description { state: "icononly" 0.0; + visible: 1; + min: 52 35; + max: 52 35; + rel1 { relative: 1.0 1.0; to: "padding_left_top"; } + rel2 { relative: 1.0 0.0; to_x: "padding_left_top"; to_y: "padding_right_bottom"; } + align: 0.5 0.5; + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + } + } + part { name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + visible: 0; + rel1 { relative: 1.0 1.0; to_x: "padding_after_icon"; to_y: "padding_left_top"; } + rel2 { relative: 0.0 0.0; to: "padding_right_bottom"; } + align: 0.5 0.5; + text { + font: "SLP:style=Medium"; + size: 32; + min: 0 0; + align: 0.5 0.5; + max: 1 0; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 90 35; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 0 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + } + description { state: "disabled_visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 90 35; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 0 0; + } + } + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + after: "text_clicked"; + } + program { name: "text_clicked"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "clicked", 0.0); + } + } + program { name: "button_unpress"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,up,1"; + source: "over3"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (strcmp(st, "icononly")) + { + emit("elm,action,default,text,set", ""); + set_state(PART:"elm.text", "visible", 0.0); + } + if(get_int(button_state) != BUTTON_STATE_DISABLED) + set_state(PART:"button_image", "default", 0.0); + } + after: button_unpress; + } + program { name: "button_unclick3"; + signal: "mouse,clicked,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "icononly")) + { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"icon_rect", "visible", 0.0); + set_state(PART:"padding_after_icon", "visible", 0.0); + } + if(get_int(button_state) != BUTTON_STATE_DISABLED) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "disabled_visible", 0.0); + } + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "visible")) + { + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"icon_rect", "icononly", 0.0); + set_state(PART:"padding_after_icon", "icononly", 0.0); + } + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "icon_show"; + signal: "elm,state,icon,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"icon_rect", "visible", 0.0); + set_state(PART:"padding_after_icon", "visible", 0.0); + } + else + { + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"icon_rect", "icononly", 0.0); + set_state(PART:"padding_after_icon", "icononly", 0.0); + } + } + } + program { name: "icon_hide"; + signal: "elm,state,icon,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "disabled_visible", 0.0); + else + set_state(PART:"elm.text", "disabled", 0.0); + set_int(button_state, BUTTON_STATE_DISABLED); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "disabled_visible")) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "default", 0.0); + set_int(button_state, BUTTON_STATE_ENABLED); + } + } + program { name: "focused"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + action: STATE_SET "default" 0.0; + target: "button_image"; + after: "unfocus_text"; + } + program { name: "unfocus_text"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } + + ////////////// elm/button/base/text_only/call_end_grey ////////////////////////////////////////////// + group { name: "elm/button/base/text_only/style_call_text_only_grey"; + images { + image: "vc_second_mt_btn_normal.png" COMP; + image: "vc_button_press.png" COMP; + } + parts { + part { name: "button_image"; + mouse_events: 1; + scale: 1; + effect: SOFT_SHADOW; + description { state: "default" 0.0; + min: 100 50; + image { + normal: "vc_second_mt_btn_normal.png"; + border: 16 16 0 0; + border_scale: 1; + } + } + description { state: "clicked" 0.0; + min: 100 50; + image { + normal: "vc_button_press.png"; + border: 16 16 0 0; + border_scale: 1; + } + } + description { state: "disabled" 0.0; + inherit: "clicked" 0.0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + image.normal: "vc_button_press.png"; + } + } + part { name: "elm.text"; + type: TEXT; + effect: SHADOW; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + fixed: 1 1; + align: 0.5 0.5; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + text { + font: FONT_SLP_Medium; + size: 48; + min: 0 0; + align: 0.5 0.5; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + color: 255 255 255 255; + color2: 0 0 0 102; + color3: 0 0 0 255; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + color3: 0 0 0 0; + } + description { state: "disabled_visible" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + color3: 0 0 0 0; + visible: 1; + min: 1 1; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 1 1; + color: 255 255 255 255; + } + } + part { name: "over1"; + mouse_events: 0; + description { state: "default" 0.0; + rel2.relative: 1.0 0.5; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + } + } + part { name: "over2"; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "over3"; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 255 255 255 0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 0; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "button_unclick"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program { name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,out"; + source: "over2"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "clicked")) + { + set_state(PART:"elm.text", "visible", 0.0); + set_state(PART:"button_image", "visible", 0.0); + } + } + } + program { name: "button_click2"; + signal: "mouse,down,1"; + source: "over3"; + action: STATE_SET "clicked" 0.0; + target: "over3"; + } + program { name: "button_unclick2"; + signal: "mouse,up,1"; + source: "over3"; + action: STATE_SET "default" 0.0; + target: "over3"; + } + program { name: "button_unclick3"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.text"; + } + + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "over1"; + target: "over2"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "disabled_visible", 0.0); + else + set_state(PART:"elm.text", "disabled", 0.0); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "over1"; + target: "over2"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "disabled_visible")) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } +} diff --git a/ui/themes/vc_btn_green.png b/ui/themes/vc_btn_green.png new file mode 100644 index 0000000000000000000000000000000000000000..87c4b51c7453a19c952fb593dcb30fab3f305ac9 GIT binary patch literal 3628 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 b`U3^xaE1d<;WksZ=Li_;n(3gmonrnEv8=@Q literal 0 HcmV?d00001 diff --git a/ui/themes/vc_button_grey.png b/ui/themes/vc_button_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..da986e87a857dd522fda2f0af82d490109383c4c GIT binary patch literal 502 zcmVy}g zpy7SsH+b&3KM%gg;0n~iOJGkw7zX2D z2;?B!Z{5%;j)EPq0IJ|l+RF%-1V>;UU+^9j?}B-7BAsOp97DXu4-s9=g2gVR%qbn7 z=VhBG?gba%9Nb8ENq`xU;)yfh&4E7LEMDSQJy#r?!{f`N>iK!uMWj@ zB_sMT`*0|xD;|+Qiiu5ZViTL##3nYeiA`)`6Pwt?CN}YZ6hDbyk-16_c&7Lk^f?r> z_q?XKB7OntDs)vSE`u?LV!Fx{7j+@wKuQM-y&}b|Ww*qyYGYkUW9rys)!V#o1@Rl~ zS^e=l85rL!L0Smj;~dC?B{2O9>6E^cSI2k4s`Lr4r_;UEdtMKj{2)l_vlX1Q+RiCB s0M@?;;7op&|6DuNJ<+i8|4V=Y09@gDh#>(Pvj6}907*qoM6N<$f;g+z{Qv*} literal 0 HcmV?d00001 diff --git a/ui/themes/vc_button_hide_keypad_normal.png b/ui/themes/vc_button_hide_keypad_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..9df94e73ffcce30185643e69153f09528cd152b7 GIT binary patch literal 3595 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 literal 0 HcmV?d00001 diff --git a/ui/themes/vc_button_red_normal.png b/ui/themes/vc_button_red_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..b0b5da13eb3a6ade049976598bce0f25cafa64b8 GIT binary patch literal 3643 zcmb7`Wmgnx8-*W2x|9atP|}?uJwta4B_RXC&><)#I5Y@{5b2Qaj-i$AZWuyZP(W#= zUe8Z>KkR+&uY0d`uXRW1YO4?v&=CLth}BdT_5YIPuiWu){<=R#p6p-XyQ`Xd0zgRq zpD;jrCJg`tIu1~%uCBeCmz$@(n>&*l6w2iO%FWKf*%knwh9oM5Fh2YmGSJ(#Vt}haX=xsoPTbD`!)JyN4|Hl}bP7I>xFV`Noa1WLJQU(^OnACHf46TMt#FVi>DSXy z0CEy2|F%87^%*Cr8Xp&rMUlMVJNSZg&th%8b+2jC% zWwc!#seB{I*zz?-v*^N`VX(GJ8VVGg*RkLm};ilNqd*l(T zm>zQ~T*wjy`M}lpWcvQ)<~r{+mh8G1sBx6V@K4|?v9Q6q(BL35@#@^X1mL92t!tJO z4-07@vN7R(e=K*alJf*0?bJSa0AQ)e#t$2=mm9zXKrttXyGDWjtc!-X6X$W)gOx7A z8!Pcp2wQJAgbYIP68ZR*6<0+tgfo1shJo8kU{;<%v{TPMJkgzmzuT~xM8=);4;(MM zi?cllA6sD%j~vdt9EoB5-h?$4k2)>vin&V_`%yF-(@-RZ9*ahTn5vNedl-|UD#MA) zD@@4K(!OpJK$ z-ekEw>2jPbbU?848x5{Vud^V3e-EVgDKCDa%}6av1yOlFU5!x%R$J7$%|xv?_M;%B zPJD4}ZwM2dQ9;#2(?okwwS?(0o9M%3di+c{K z%th%}>qV51i@r{m91EdR(8tVVEFEJ&8Su zo?8G`T2@rHRz_%eYB&OmE44HTs8Ti*G1w}_pG__|EX&gUZa{Bd)cOnWqYbf5)#Ikhjg+WVOZZD{L#c$uAu%fnv>iS@GAjxD`?!`+s8%g`1rQ&yTQ z2^CQnF|OA?{b(nLyOrv3mFcC8zsFgeavJ!4jpCSVlZ(DcRI^3M*4(KqIVIVoT(w-U zT;+R*c-3KXR#Asio9T5BiNb(7hdGA|B5wRa)}FzV!D=xEc4l@Btply2bbYOsBCaAS zO)1TRvC*--vH3Ky3>l#X;k}H#jD?K#CadQ@&v{WLsAgNWy6xvhrbnoD*Rbc3riCVk z&n@beE3+z}%(qpx6+bL)(N5GZ&z?v0)cisXp-P)*YjzfK&{ZfGQ~(@dO^s;ktLiyQ z>_`k~4fyv~2A4QuiKLw2IYXdl!z+qsM$gvL$1{)Q0{YI9_XQ9p6J!&MB3mf(5w2c` zEQ5?06$CY+#WUnIGCE2lc!WPimOq2Oe|4~9Tixs2!(zj4`aCP6KBN1v1YLb3e&lcz zvGQqD^b=RMsfg!f&mi=x-p-U9;in`)r}c_J9jHzaqH&K^z(yd!xN@PUsnEOZ5`IiA zdm;Pk)0XU(w8Wb5n(2#CiO#0MrV*VUx9k^T>(F1L?x#R8@(Bh4D=J7K$PDxP z%I_`nmsq)HXxodrr9*|7oE8O2g}C6#;GM2YX8XY(@s-S%d#U3I;|?TYx`E&3CvoAs z@aUdEB95?#FynB!SocU1x+$R)G4H7rsOP%kAH`(FwG4!ij$}2Tx)`@?8NZ|SvP7$B zt6V?7o$2VDNtTJ4v&Lgde(ox9SLe^`H;1PYn^~KLTmICk0)rOrzPaPwXJN%urTmY0 zpC!v{MruF(_)~$5yM!v{$qBjllUM@ZZia3Ii@=olROBMmoSRYmM3r01@57ITb}?VJ zK9NG+ot99J()e~wV$IczXW3NgZ4@~(8P>`Z;u;-i$+_-fJTVuN~V^PDB$>rHRV~3;l!{~U4%;Qh@ zhmX1+ZG1o#hHDt}F_`RjR5(i3NqhLB3AQL7@Pr%TR7f|!M{&E%>69NDr&I-Yu={B_ z1zC0t2X{4MIDIEHB-jZH_`b4mXrW^wV7lH2{}Y}?FH0HqzKQ}(okIC;k#ogohd#n> z_)FT#$A;4K-j7p`2Vj_Cc{FGPRLq0QPaZ)Jx*qYW_(wdU;R zY_HX>>o4W1qRRHKlCNDXDz#la4hOKNv2Jl$Nl*(dvvUm7GBEwPd7keoBm@6^zRNoH z<|7s-HvBiUf0NZ+(RX|Q5`X=Yk@(s2n;8F!4cwW3-Y_5-1RNphC+W%=2I<#k)@H3b zqq0-;2Wx&eD(HVmGexCMebrB4Lk`RP!83`7lZlwDq^y8I{@*KB=scAFp3V5WBdObQ zE1B2Ew9aTkxcN!5*GV0EhupZ?IKBGW3zq}01L?cO8J&T)%(nEZ7IUYTBfpMD zf4j?l`fQ2u)w2%YUsU(=bJ>zIs~x9)ZkK(R=j&9ffv-4j$4A7qKAnQrvZNlM}um$!wt2c6$(tI_@4{fwW7d_;sS z&y21QyS!Jt8IJSUNp-g0GQH!xxBp#xZZKJVok*LQc#n;hdU|6c!iWC*Z!+1a>T3bu z_XGfB2mrtD|8gII*Ma~XSOM@X6##0t4=?(Z0l>0TQ&fQYEdM}j*^?_!;QqWH4P+}7 zUveaI3HuYYY>=z_vw-t~0tG>Eakk%BV_{CM3cW^d%LO+cB$w=)8W}-f2q#`JZmm&e zFv@z_bvoTyxJ`ud!#o{bqWp*RpNu~oB7Ei6M#q2b)b6Wd6Dvv}6HaD`tx7g;oj?ZA z2gx}8m~uQE&A*QZ63D;5#&pGsq|LM-#g$}HAjuN(qWMv+AekF(UK;PQT^Ymr%PzkL z+bXbz<7a~rrcpji3PvvkhyL(zc8d1vzc5l-6>HB4CCd^O+sSfA%HIp4-o)eCpHMMV zcO^@Ln1Dqg_O2vKR^y+UrqL?W}oH=Yln)Ssc2!pz7T|) z)}KRmyD?+~?+Wk@Z0wCv>3aG~qTG=>jA5mrE60M1S84oM?Y`l1Lp1J1Bl5b4MEsHT z3Y->a_lvL2(PR-qd)hRUk{Mbi^M(0LwQDsbP^a9@N#XNwF%W48Ir5@$ZlI;FU;9Sj zfJf`h3pbS@fm(OK84ihXa;}>Lbty@{zLiJx3~0r^QF%HDcXVchn+81YWZ+p0>*n$@+u}U$iEyt&MeNOOWHl~? zu5^N#u$l1`@E~NtWTF2@EGQ(?;aY!408)nEg~EO|>tC@;-;3_7ypTjT`7X$*T5X#{CQU#2eMo6iA;OGEyHgy&CP(K?B;1BOG*E)%n@XY9hUnpG~88LgU1 zI&d)yMHEw_2Rggt@*-;xU#u~m%Dx|GZAjy-D&fDdAH7n_=DwEJ}RRbr5{vu zxQA41YsJx5*3lf0GM*5bpfpDtCo#)PU^0Z?_|wB|b_VwTl>t{>Y-s!et-4HR>GN-X zQl0uhA5wNynJH11bn4i+#GgBB*JkQ=9!LsC&N5q6MobI=gy_Xt9E@f>onL)DRoJM2&6*iQW=oW!2R?LDW?e zZI$4og+zON|AS}dp8NXso-=c1ZrtNXIy97bC;69JH$&kg{T#;#E4T-{V{H7;#jlW$?lY}to1@o_v#R*&V^qU98J3(nQ&+}BE}Xgo!p-nAqQ9r_ z*Sdr{l2X7MpeJu|%1GW_dUvJXc+! zD=3FU8YxTn^LPXR3R78b-5y^Bj?vbRjmamWY3;;!I!JH$930lJH^!^H)dAp_U)aR8 z7`Wk1xDsi&=XLSDePWkqRE4k35}fPl)Ej}q?FGwY@Bd|^Rg{96pWj$tpVRMwSi^@b zL$48Cc38_RkH2BcmuIIx+gAmU(zZw);`5(fBPWI>cgNExA{`btlXWhesBSK~rucgF z9566Z<~0*WpCrxP#AE3azBovlNbkML8^_fZu?r&A6*=Iun<_y_s(88WbD}>6Li8{{ z?CKc+9JP3L{tzZ73U`V4H6CztpmwEGcn=77)=TpNfM=Ql66Qk% zbXk0(Rq>|#2PZG+6mCUQ5NiyOGr@TmVhJ4LVf;ztY&lWqyq&tlj0pmu!B}P!K7&*_ zT`ALebC88D*O7`Zp+by}c5|xI03iMLGP+eq>OHdFMCAu{BNS8q;7+7=G1YfRKdIbg z*228+zF+UCB+3`zzgM}?EhMW#`z5hk>|`=M9+DD$-H57n5!$rQB&M86_EoOJXauXCK}k(<#?&1bHkUKkx-GwEhNTSdM_J!3 zCx^Fnwz9T}P6DWDqFEyPV-dm}dF*8D2#x^ux@^Nzj;REWesjqOQoGss9J(AY3z#Tc z^fgQB5M_pbhF}J#DA>HBvb1u!lFH)PV%R*n;+a`!t+s`X*;)m~kIX8IO4Q?BGfp!^ zg;IG;C8FHRTF=YnGZx(ML0`k4KY$q zHtv;~S(&gZ-71qRo!vJ1+PyMVX`5Dy)diAPqhDXhMo0&dJVt`To6Vaol~IHGwtHKF_|7f~11Hf(AxA zM*F#@Mwn8OQYAwr!~W5c(c;mW9JxFdsaa`!9zJh2Z>7opY2Z^abUFH)lV1J$(^9K_ zbnA<#rwUdjFpHp+@x~L(+YvI?Nbqj6^iz`N7Y@sg^af zpPNboD$n2tY^r}$eLt+Jt|>oQmR`298+m|j8fY3e?)ECMi&}xc;lFXb3BH*C%EIpv zAc*3S8c1uxi}T>uyd6nuia4h~_49igiG>&q7LDY$HE%aMYj|A-ey7y%p5e2{Qpa3r zqaKHC&3q?=Z^9G0!>EO#Vxlag)snnpVRt5^vg86L7NIX!H2-O4YA)v?q>L5n#P#Jw zRVyXjlouW}%Qma^NjO`LOv6wxJr9Gs3KF8V@-IBvS1$LCV^&eCRBIt@+28?N@1UZw zu9K)T)(QzmF~v-E!`Md;-~XpUFIvu;c<+cQ;9e4CP#0Ghf)6|)KM^|zwGrihbfhb4 z6rA=uwN)-ipjW0uYy%T1RFTqZNMpE^r&z$6>ksmjR#9w|ibzXM@qtwG8l|HVJBUqZ z|KVza*c)Le)JR4YUOY7Xi?8;bLlp9f@yNk1Xw#G29)k-7$Uo?tSl_f5|mKn#E#qwrO zcrkE;GsbJEBWLmb*NUnhjN`cTr1SRXvUq_tZDwWGW)|%Wn)!vVG%HWO?w$V8!hy3! zg>fwrXej1mhw`^pr?SDZQ6)9=Pv$4)|IFq0Czl%Gv*#}+_BlgZ|H%HH##y(XU8xSX z<17d)jHaEZoi6k)8qU;e<0`k$GcP=CYaV&}?DZ2(5?zt;)1qfFKc=}RRm@G3XYTLn z(Dw7RU!x8J#A)PdEZ*h!t@3+o2CZ+OQLLPC(m~uO)T%UQbM(#cs2;b$Wckf9w@%T{bH{H-`8s{dxW6U8CASu1 zPT~#h#25=pGT%j{we+_ygeB<)>%cZ05-2QyIySoAo`%EsbL-Vi{4vdvEo@?TARxcu`937+Iv;kneWlSuyh?c0Eo z;~m)kWht`77QaGB@>9ots=m5=pVPy`t8 z4iosz@89yT}H^4>?98se#Jro%-G8;dzfg z7qnYO9quJmnVUJq!d0cNjLH2Nef<)~mX?w3oXzGb4E=*2%y%ElCjK||mEHZZED=R;licojMwxhPAUl;BEo6_V%iVfQYI9ds& z>K3{##CziIUxCh;wf>6c7}ApXaHksz#%c1^dElP?Ceh0)jVl(WR;sLY$Q4v?<~({l zd#W>gXiu9PsGL;l%7a5+bq47M`}=3+B?{<`jEr1f)eT@n*4Ea}z_{vYhHlBn7O&>f zdpPO;{+p?>PUK4yU`Xf%xCgKoOiWCPqNt2-V4?t7BTkM_Qx{2MdTBvSbsiml!7G_D zm>`;e`2+RJg30gRN$u#SMUK1?Amju6Kj%h9m!6o=mv!YVH3B63w_QzIvuc`fE*-gd zdt0i8Vq25b&!*ruRcYOi6TrDGseIM+&HxCttTu?{d8hsSVtw6FV0blX`9soLs{&3( zx^{Q@q2rr3JfN3hP-}43u$Rhsi z&Lb2)XcuGiVk^Z)A_gC{@-XSxv%_mN-L&Gp2s0%V%1lWzwBg(5lRrMjb0Ft-Ir++V zVb6a-)<{6FnN^)Vdi^*kzSn^?a3Zvw&5p?XIt%pC)_s2kXq!R~-w(rP$fG zAeh?2hv)S$G1Ua^k3DNX#S<=e?+-41xXBG|NH;#ESvj*K1d9zTwv|tSULG3##2j3> zXXrasm{zwG9m9y@ozDznl7Gp%Luna@`T%o4d2?BD($Q3~+4 literal 0 HcmV?d00001 diff --git a/ui/themes/vc_button_rej_w_msg_press.png b/ui/themes/vc_button_rej_w_msg_press.png new file mode 100644 index 0000000000000000000000000000000000000000..1267a27d60bdad7aab3b1b247b444c8bcc642a18 GIT binary patch literal 3717 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 literal 0 HcmV?d00001 diff --git a/ui/themes/vc_conf_call_list_bg.png b/ui/themes/vc_conf_call_list_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..42cabe8b7e5615eba24b35e8a9a0abbd374e543f GIT binary patch literal 2818 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 VS40OW7cl?;002ovPDHLkV1jW9vNr$# literal 0 HcmV?d00001 diff --git a/ui/themes/vc_conference_call_btn_press.png b/ui/themes/vc_conference_call_btn_press.png new file mode 100644 index 0000000000000000000000000000000000000000..7b9fc6e07d683076002c4786d36d7b7b891d17f3 GIT binary patch literal 3093 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 literal 0 HcmV?d00001 diff --git a/ui/themes/vc_conference_call_btn_red.png b/ui/themes/vc_conference_call_btn_red.png new file mode 100644 index 0000000000000000000000000000000000000000..7494936095ecae5cb00416c30dd6337adbedf7d2 GIT binary patch literal 3077 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 ThB_O800000NkvXXu0mjfIQzEX literal 0 HcmV?d00001 diff --git a/ui/themes/vc_control_btn_new_prev.png b/ui/themes/vc_control_btn_new_prev.png new file mode 100644 index 0000000000000000000000000000000000000000..d708747f29b27d0d254150849eb8a4e5a78e08a1 GIT binary patch literal 3259 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 )3(nlH2X_s-`7d}6{&5H8P=(q`jL9bRy9 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 Ks@K5n!v6=FV+5c8 literal 0 HcmV?d00001 diff --git a/ui/themes/vc_six_btn_layout_normal.png b/ui/themes/vc_six_btn_layout_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..10e74b55d95cea11852e57e971830e32e3428bc0 GIT binary patch literal 3329 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 EKOSB>&;S4c literal 0 HcmV?d00001 diff --git a/ui/themes/vc_six_btn_layout_press.png b/ui/themes/vc_six_btn_layout_press.png new file mode 100644 index 0000000000000000000000000000000000000000..f4e474c8dfa1e4a3e88f97f22eaae197f0d515fd GIT binary patch literal 3320 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 literal 0 HcmV?d00001 diff --git a/ui/vcui-app-data.h b/ui/vcui-app-data.h new file mode 100755 index 0000000..8ff4314 --- /dev/null +++ b/ui/vcui-app-data.h @@ -0,0 +1,168 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_APP_DATA_H_ +#define _VCUI_APP_DATA_H_ + +typedef enum { + CALL_LOCK = 1, + CALL_UNLOCK +} vcui_app_lock_type_t; + +typedef enum { + CALL_OUTGOING = 1, + CALL_INCOMING +} vcui_app_call_dirction_t; + +typedef enum { + CALL_HOLD = 1, + CALL_UNHOLD +} vcui_app_call_status_t; + +#define TIME_END_START 1 +#define TIME_END_NO 0 +#define TIME_END_MAX_SHOW 8 + +#define MY_HANDLE 252 +#define ALL_HANDLE 253 +#define NO_HANDLE 254 +#define NO_STATUS 254 + +#define WIN_HIDE 0 +#define WIN_SHOW 1 + +typedef enum { + VIEW_DIALLING_VIEW = 0, + VIEW_INCOMING_VIEW, + VIEW_INCOMING_LOCK_VIEW, + VIEW_INCALL_ONECALL_VIEW, + VIEW_INCALL_MULTICALL_SPLIT_VIEW, + VIEW_INCALL_MULTICALL_CONF_VIEW, + VIEW_INCALL_MULTICALL_LIST_VIEW, + VIEW_INCALL_KEYPAD_VIEW, + VIEW_ENDCALL_VIEW, + VIEW_MAX +} vcui_app_call_view_id_t; + +typedef struct _appdata { + Evas *evas; + Evas_Object *win_main; + + int root_w; /**root_w, &ad->root_h); + evas_object_resize(eo, ad->root_w, ad->root_h); + elm_win_indicator_mode_set(eo, ELM_WIN_INDICATOR_SHOW); + evas_object_smart_callback_add(eo, "focus-in", __vcui_app_win_focus_in_cb, ad); + evas_object_smart_callback_add(eo, "focus-out", __vcui_app_win_focus_out_cb, ad); + } + + return eo; +} + +static void __vcui_app_win_focus_in_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); +} + +static void __vcui_app_win_focus_out_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); +} + +static void __vcui_app_win_main_win_del_cb(void *data, Evas_Object *obj, void *event) +{ + CALL_UI_DEBUG(".."); + elm_exit(); +} + +static Eina_Bool __vcui_app_win_hard_key_down_cb(void *data, int type, void *event) +{ + CALL_UI_DEBUG(".."); + + vcui_app_call_data_t *ad = (vcui_app_call_data_t *) data; + Ecore_Event_Key *ev = event; + + retvm_if(ev == NULL, 0, "ERROR!!! ========= Event is NULL!!!"); + + if (ad->view_top == -1) { + CALL_UI_DEBUG("ad->view_top is -1."); +#ifndef END_KEY_PROCESSING + if ((ad->contact_ug != NULL) && (!strcmp(ev->keyname, KEY_END))) { + CALL_UI_DEBUG("send end key to contact ug."); + ug_send_key_event(UG_KEY_EVENT_END); + } +#endif + return EINA_FALSE; + } + + if (!strcmp(ev->keyname, KEY_VOLUMEUP)) { + CALL_UI_DEBUG("[KEY]KEY_VOLUMEUP pressed"); + if ((ad->view_st[ad->view_top]->type == VIEW_INCOMING_VIEW) || (ad->view_st[ad->view_top]->type == VIEW_INCOMING_LOCK_VIEW)) { + _vcui_engine_interface_process_mute_alert(); + ad->bmute_ringtone = EINA_TRUE; + } else { + ad->vol_longpress_cnt = 0; + if (_voicecall_dvc_get_proximity_sensor_state() != VCALL_SENSOR_NEAR) + _voicecall_dvc_control_lcd_state(VC_LCD_ON); + _vcui_set_volume(VAL_VOL_UP); + ad->volup_key_longpress_timer = ecore_timer_add(VOLUME_KEY_LONG_PRESS_TIMEOUT, __vcui_app_win_volup_key_longpress_timer_cb, ad); + } + } else if (!strcmp(ev->keyname, KEY_VOLUMEDOWN)) { + CALL_UI_DEBUG("[KEY]KEY_VOLUMEDOWN pressed"); + if ((ad->view_st[ad->view_top]->type == VIEW_INCOMING_VIEW) || (ad->view_st[ad->view_top]->type == VIEW_INCOMING_LOCK_VIEW)) { + _vcui_engine_interface_process_mute_alert(); + ad->bmute_ringtone = EINA_TRUE; + } else { + ad->vol_longpress_cnt = 0; + if (_voicecall_dvc_get_proximity_sensor_state() != VCALL_SENSOR_NEAR) + _voicecall_dvc_control_lcd_state(VC_LCD_ON); + _vcui_set_volume(VAL_VOL_DOWN); + ad->voldown_key_longpress_timer = ecore_timer_add(VOLUME_KEY_LONG_PRESS_TIMEOUT, __vcui_app_win_voldown_key_longpress_timer_cb, ad); + } + } + + CALL_UI_DEBUG("End.."); + return EINA_FALSE; +} + +static Eina_Bool __vcui_app_win_hard_key_up_cb(void *data, int type, void *event) +{ + CALL_UI_DEBUG(".."); + + vcui_app_call_data_t *ad = (vcui_app_call_data_t *) data; + Ecore_Event_Key *ev = event; + + retvm_if(ev == NULL, 0, "ERROR!!! ========= Event is NULL!!!"); + + if (0 == strcmp(ev->keyname, KEY_VOLUMEDOWN)) { + if (ad->ringtone_longpress_mute_timer) { + ecore_timer_del(ad->ringtone_longpress_mute_timer); + ad->ringtone_longpress_mute_timer = NULL; + } + } + + ad->vol_longpress_cnt = 0; + + if (ad->volup_key_longpress_timer) { + ecore_timer_del(ad->volup_key_longpress_timer); + ad->volup_key_longpress_timer = NULL; + } + + if (ad->voldown_key_longpress_timer) { + ecore_timer_del(ad->voldown_key_longpress_timer); + ad->voldown_key_longpress_timer = NULL; + } + + return EINA_FALSE; +} + +static Eina_Bool __vcui_app_win_mouse_down_cb(void *data, int type, void *event) +{ + /*CALL_UI_DEBUG("..");*/ + + vcui_app_call_data_t *ad = (vcui_app_call_data_t *) data; + Ecore_Event_Mouse_Button *ev = event; + + ad->touch_x = ev->x; + ad->touch_y = ev->y; + return EINA_FALSE; +} + +void _vcui_app_win_key_grab(vcui_app_call_data_t *ad) +{ + int result = 0; + CALL_UI_KPI("_vcui_app_win_key_grab start"); + + /* Key Grab */ + ad->disp = ecore_x_display_get(); + ad->win = elm_win_xwindow_get(ad->win_main); + + result = utilx_grab_key(ad->disp, ad->win, KEY_VOLUMEUP, EXCLUSIVE_GRAB); + if (result) + CALL_UI_DEBUG("KEY_VOLUMEUP key grab failed"); + + result = utilx_grab_key(ad->disp, ad->win, KEY_VOLUMEDOWN, EXCLUSIVE_GRAB); + if (result) + CALL_UI_DEBUG("KEY_VOLUMEDOWN key grab failed"); + + if (ad->downkey_handler == NULL) + ad->downkey_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, __vcui_app_win_hard_key_down_cb, ad); + if (ad->upkey_handler == NULL) + ad->upkey_handler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, __vcui_app_win_hard_key_up_cb, ad); /* (for long press)*/ + if (ad->mouse_evnt_handler == NULL) + ad->mouse_evnt_handler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, __vcui_app_win_mouse_down_cb, ad); /*for ctxpopup*/ + + CALL_UI_KPI("_vcui_app_win_key_grab done"); +} + +static Eina_Bool __vcui_app_win_longpress_mute_timer_cb(void *data) +{ + CALL_UI_DEBUG(".."); + + vcui_app_call_data_t *ad = (vcui_app_call_data_t *) data; + call_data_t *call_data = _vcui_doc_get_recent_mt(); + + if (call_data == NULL) + return ECORE_CALLBACK_CANCEL; + + if (ad->ringtone_longpress_mute_timer) { + ecore_timer_del(ad->ringtone_longpress_mute_timer); + ad->ringtone_longpress_mute_timer = NULL; + } + + ad->vol_longpress_cnt = 0; + + if (ad->volup_key_longpress_timer) { + ecore_timer_del(ad->volup_key_longpress_timer); + ad->volup_key_longpress_timer = NULL; + } + + if (ad->voldown_key_longpress_timer) { + ecore_timer_del(ad->voldown_key_longpress_timer); + ad->voldown_key_longpress_timer = NULL; + } + + _vcui_view_popup_unload(ad->vol_ringtone_popup_eo); + + _vcui_engine_interface_process_mute_alert(); + ad->bmute_ringtone = EINA_TRUE; + + return ECORE_CALLBACK_CANCEL; +} + +static Eina_Bool __vcui_app_win_volup_key_longpress_timer_cb(void *data) +{ + CALL_UI_DEBUG(".."); + + vcui_app_call_data_t *ad = (vcui_app_call_data_t *) data; + + if ((ad->view_st[ad->view_top]->type == VIEW_INCOMING_VIEW || ad->view_st[ad->view_top]->type == VIEW_INCOMING_LOCK_VIEW)) { + if((ad->ringtone_val == RINGTONE_MAX) || (ad->bmute_ringtone == EINA_TRUE)){ + if (ad->volup_key_longpress_timer) { + ecore_timer_del(ad->volup_key_longpress_timer); + ad->volup_key_longpress_timer = NULL; + } + return ECORE_CALLBACK_CANCEL; + } + } else if (ad->headset_status == EINA_TRUE) { + if(ad->bt_vol_val== BT_VOL_MAX) { + if (ad->volup_key_longpress_timer) { + ecore_timer_del(ad->volup_key_longpress_timer); + ad->volup_key_longpress_timer = NULL; + } + return ECORE_CALLBACK_CANCEL; + } + } else { + if(ad->voice_vol_val == VOICE_VOL_MAX) { + if (ad->volup_key_longpress_timer) { + ecore_timer_del(ad->volup_key_longpress_timer); + ad->volup_key_longpress_timer = NULL; + } + return ECORE_CALLBACK_CANCEL; + } + } + + ad->vol_longpress_cnt++; + + if ((ad->vol_longpress_cnt % 3) == 0) { + _vcui_set_volume(VAL_VOL_UP); + } + + return ECORE_CALLBACK_RENEW; +} + +static Eina_Bool __vcui_app_win_voldown_key_longpress_timer_cb(void *data) +{ + CALL_UI_DEBUG(".."); + + vcui_app_call_data_t *ad = (vcui_app_call_data_t *) data; + + if ((ad->view_st[ad->view_top]->type == VIEW_INCOMING_VIEW || ad->view_st[ad->view_top]->type == VIEW_INCOMING_LOCK_VIEW)) { + if((ad->ringtone_val == RINGTONE_MAX) || (ad->bmute_ringtone == EINA_TRUE)) { + if (ad->voldown_key_longpress_timer) { + ecore_timer_del(ad->voldown_key_longpress_timer); + ad->voldown_key_longpress_timer = NULL; + } + return ECORE_CALLBACK_CANCEL; + } + } else if (ad->headset_status == EINA_TRUE) { + if(ad->bt_vol_val == BT_VOL_MIN) { + if (ad->voldown_key_longpress_timer) { + ecore_timer_del(ad->voldown_key_longpress_timer); + ad->voldown_key_longpress_timer = NULL; + } + return ECORE_CALLBACK_CANCEL; + } + } else { + if(ad->voice_vol_val == VOICE_VOL_MIN) { + if (ad->voldown_key_longpress_timer) { + ecore_timer_del(ad->voldown_key_longpress_timer); + ad->voldown_key_longpress_timer = NULL; + } + return ECORE_CALLBACK_CANCEL; + } + } + + ad->vol_longpress_cnt++; + + if((ad->vol_longpress_cnt % 3) == 0) { + _vcui_set_volume(VAL_VOL_DOWN); + } + + return ECORE_CALLBACK_RENEW; +} + +void _vcui_app_win_set_noti_type(int bwin_noti) +{ + Ecore_X_Window xwin; + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + /* Get x-window */ + xwin = elm_win_xwindow_get(ad->win_main); + + if (bwin_noti == EINA_FALSE) { + CALL_UI_DEBUG("window type: NORMAL"); + /* Set Normal window */ + ecore_x_netwm_window_type_set(xwin, ECORE_X_WINDOW_TYPE_NORMAL); + } else { + CALL_UI_DEBUG("window type: NOTI-HIGH"); + /* Set Notification window */ + ecore_x_netwm_window_type_set(xwin, ECORE_X_WINDOW_TYPE_NOTIFICATION); + /* Set Notification's priority to LEVEL_HIGH */ + utilx_set_system_notification_level(ecore_x_display_get(), xwin, UTILX_NOTIFICATION_LEVEL_HIGH); + } + return; +} + diff --git a/ui/vcui-app-window.h b/ui/vcui-app-window.h new file mode 100755 index 0000000..aab8e7c --- /dev/null +++ b/ui/vcui-app-window.h @@ -0,0 +1,27 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VCUI_APP_WINDOW_H_ +#define __VCUI_APP_WINDOW_H_ + +#include "vcui-application.h" + +Evas_Object *_vcui_app_win_create_main(vcui_app_call_data_t *ad, const char *name); +void _vcui_app_win_key_grab(vcui_app_call_data_t *ad); +void _vcui_app_win_set_noti_type(int bwin_noti); + +#endif /* __VCUI_MAIN_H_ */ diff --git a/ui/vcui-application.c b/ui/vcui-application.c new file mode 100755 index 0000000..41c9d7d --- /dev/null +++ b/ui/vcui-application.c @@ -0,0 +1,1224 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-app-window.h" +#include "vcui-app-data.h" +#include "vcui-document.h" + +#include "vcui-view-dialing.h" +#include "vcui-view-incoming.h" +#include "vcui-view-incoming-lock.h" +#include "vcui-view-keypad.h" +#include "vcui-view-single-call.h" +#include "vcui-view-multi-call-split.h" +#include "vcui-view-multi-call-conf.h" +#include "vcui-view-multi-call-list.h" +#include "vcui-view-callend.h" + #include "vcui-view-popup.h" +#include +#include +#include +#include +#ifdef SIGNAL_HANDLER +#include +#endif + +static vcui_app_call_data_t global_ad; + +#ifdef SIGNAL_HANDLER +#define VCUI_SIG_NUM 12 +static struct sigaction vcui_app_sigact; +static struct sigaction vcui_app_sigoldact[VCUI_SIG_NUM]; +static int vcui_app_sig_to_handle[] = {SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGQUIT,SIGSEGV,SIGSYS,SIGTRAP,SIGXCPU,SIGXFSZ,SIGTERM,SIGPIPE}; +#endif + +static gboolean g_avoid_multi_setup = EINA_FALSE; +static Eina_Bool __vcui_avoid_multi_setup_timer_cb(void *data); + +#define CISS_AUL_CMD "org.tizen.ciss" +#define CISS_MODE_OPT "REQ" +#define __VCUI_NOTIFICATION_CALL_GROUP_ID 1001 + +static int __vcui_launch_ciss(const char *number); +static void __vcui_cache_flush_set(Evas *e); +static void __vcui_init_view_register_function(vcui_app_call_data_t *app_data, vcui_app_call_view_id_t view_id, voice_call_view_data_t *(*view_new) ()); +static int __vcui_app_create(void *data); +static int __vcui_app_pause(void *data); +static int __vcui_app_reset(bundle *kb, void *data); +static int __vcui_app_resume(void *data); +static int __vcui_app_terminate(void *data); +static void __vcui_fade_out_cb_routine(void); +static int __vcui_lang_changed_cb(void *data); +static int __vcui_low_mem_cb(void *data); +static int __vcui_low_bat_cb(void *data); +static void __vcui_init(vcui_app_call_data_t *ad); + +#ifdef SIGNAL_HANDLER +/** +* This function serves as the signal handler function for the SIGSEGV Signal +* +* @return nothing +* @param[in] signal_no Signal Number +* @param[in] signal_info Information associated with the generated signal +* @param[in] signal_context Signal Context Info +*/ +static void __vcui_exit_handler(void) +{ + printf("\n __vcui_app_exit_handler\n"); + /*syslog (LOG_INFO, "[VOICE-CALL] __vcui_app_exit_handler\n");*/ +} + +/** +* This function serves as the signal handler function for the SIGSEGV Signal +* +* @return nothing +* @param[in] signal_no Signal Number +* @param[in] signal_info Information associated with the generated signal +* @param[in] signal_context Signal Context Info +*/ +static void __vcui_sigsegv_handler(int signal_no) +{ + int i=0; + + CALL_UI_DEBUG("SISEGV Received, Signal Number: :%d \n", signal_no); + + vcall_engine_force_reset(); + __vcui_fade_out_cb_routine(); + + for (i=0; i < VCUI_SIG_NUM; i++) + { + sigaction(vcui_app_sig_to_handle[i], &(vcui_app_sigoldact[i]), NULL); + } + + raise(signal_no); /*raise signal intentionally (pass the same signal)*/ +} + +/** +* This function registers a user space signal handler for the signal SIGSEGV (Signal #11) +* +* @return nothing +*/ +static void __vcui_register_sigsegv_handler() +{ + CALL_UI_DEBUG(".."); + + int i =0; + vcui_app_sigact.sa_flags = SA_NOCLDSTOP; + vcui_app_sigact.sa_handler = (void *)__vcui_sigsegv_handler; + sigemptyset(&vcui_app_sigact.sa_mask); + + + for (;i < VCUI_SIG_NUM; i++) + { + sigaction (vcui_app_sig_to_handle[i], &vcui_app_sigact, &(vcui_app_sigoldact[i])); + } + +} +#endif + +static int __vcui_launch_ciss(const char *number) +{ + bundle *kb; + + CALL_UI_DEBUG("number(%s)"); + kb = bundle_create(); + bundle_add(kb, "CISS_LAUNCHING_MODE", CISS_MODE_OPT); + bundle_add(kb, "CISS_REQ_STRING", number); + aul_launch_app(CISS_AUL_CMD, kb); + bundle_free(kb); + return VC_NO_ERROR; +} + +static int __vcui_app_create(void *data) +{ + CALL_UI_DEBUG("__vcui_app_create().."); + CALL_UI_KPI("__vcui_app_create start"); + vcui_app_call_data_t *ad = data; + + elm_theme_extension_add(NULL, CALL_THEME); + + CALL_UI_KPI("_vcui_app_win_create_main start"); + ad->win_main = (Evas_Object *)_vcui_app_win_create_main(ad, PACKAGE); + CALL_UI_KPI("_vcui_app_win_create_main done"); + if (ad->win_main == NULL) { + CALL_UI_DEBUG("ERROR"); + return VC_ERROR; + } + + UG_INIT_EFL(ad->win_main, UG_OPT_INDICATOR_ENABLE); + + __vcui_hide_main_ui_set_flag(); + + ad->evas = evas_object_evas_get(ad->win_main); + ad->scale_factor = elm_config_scale_get(); + + __vcui_cache_flush_set(ad->evas); + + ecore_init(); + ecore_x_init(NULL); + _vcui_app_win_key_grab(ad); + + _vcui_view_common_timer_text_init(); + + _vcui_app_win_set_noti_type(EINA_TRUE); + + /* add system event callback */ + appcore_set_event_callback(APPCORE_EVENT_LANG_CHANGE, __vcui_lang_changed_cb, ad); + appcore_set_event_callback(APPCORE_EVENT_LOW_MEMORY, __vcui_low_mem_cb, NULL); + appcore_set_event_callback(APPCORE_EVENT_LOW_BATTERY, __vcui_low_bat_cb, NULL); + +#ifdef SIGNAL_HANDLER + __vcui_register_sigsegv_handler(); + atexit(__vcui_exit_handler); +#endif + + CALL_UI_KPI("__vcui_app_create done"); + return VC_NO_ERROR; +} + +static int __vcui_app_pause(void *data) +{ + CALL_UI_DEBUG("__vcui_app_pause().."); + + vcui_app_call_data_t *ad = (vcui_app_call_data_t *) data; + return VC_NO_ERROR; +} + +static int __vcui_app_reset(bundle *kb, void *data) +{ + CALL_UI_DEBUG("__vcui_app_reset().."); + CALL_UI_KPI("__vcui_app_reset start"); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *) data; + + const char *launch_type = NULL; + const char *mime_type = NULL; + const char *tmp = NULL; + const char *uri_bundle = NULL; + char *telnum = NULL; + +#ifdef _RESET_OPEN_APP_ + { + launch_type = bundle_get_val(kb, "__AUL_CMD__"); + if (launch_type != NULL) { + CALL_UI_DEBUG("launch type: [%s]", launch_type); + if (!strncmp(launch_type, "OPEN_APP", 8)) { + elm_win_raise(ad->win_main); + return; + } + } + } +#endif + + /* mime content based AUL */ + mime_type = bundle_get_val(kb, AUL_K_MIME_TYPE); + if (mime_type != NULL) { + CALL_UI_DEBUG("mime_type: [%s]", mime_type); + if (strncmp(mime_type, "phonenum.uri",12) == 0 || strncmp(mime_type, "tel.uri",7) == 0) { + tmp = bundle_get_val(kb, AUL_K_MIME_CONTENT); + if (tmp == NULL) { + CALL_UI_DEBUG("bundle val is NULL"); + elm_exit(); + return VC_NO_ERROR; + } + + if (strncmp(tmp, "tel:", 4) == 0) { + telnum = (char *)tmp + 4; + } + + CALL_UI_DEBUG("number: [%s]", telnum); + + vcui_call_type_t call_type; + vcui_call_mo_data_t call_data; + + memset(&call_data, 0, sizeof(call_data)); + call_type = VCUI_CALL_TYPE_MO; + + snprintf(call_data.call_number, sizeof(call_data.call_number), "%s", telnum); + + _vcui_engine_interface_process_mo_call(call_type, &call_data); + + return VC_NO_ERROR; + } else { + CALL_UI_DEBUG("wrong mime type!!"); + elm_exit(); + return VC_NO_ERROR; + } + } + + uri_bundle = (const char *)appsvc_get_uri(kb); + if (uri_bundle != NULL) { + CALL_UI_DEBUG("tmp: [%s]", uri_bundle); + if (strncmp(uri_bundle, "tel:", 4) == 0) { + telnum = (char *)uri_bundle + 4; + CALL_UI_DEBUG("number: [%s]", telnum); + + vcui_call_type_t call_type; + tmp = (char *)appsvc_get_data(kb, "calltype"); + + if (tmp) { + CALL_UI_DEBUG("calltype: [%s]", tmp); + if (!strncmp(tmp, "EMERGENCY", 9)) { + vcui_call_ecc_data_t call_data; + + memset(&call_data, 0, sizeof(call_data)); + call_type = VCUI_CALL_TYPE_ECC; + + snprintf(call_data.call_number, sizeof(call_data.call_number), "%s", telnum); + + _vcui_engine_interface_process_ecc_call(call_type, &call_data); + } else { + CALL_UI_DEBUG("wrong calltype!"); + elm_exit(); + return VC_ERROR; + } + } else { + vcui_call_mo_data_t call_data; + + memset(&call_data, 0, sizeof(call_data)); + + snprintf(call_data.call_number, sizeof(call_data.call_number), "%s", telnum); + + call_type = VCUI_CALL_TYPE_MO; + + tmp = (char *)appsvc_get_data(kb, "ctindex"); + if (tmp) { + CALL_UI_DEBUG("ctindex: [%s]", tmp); + call_data.ct_index = atoi(tmp); + } else { + CALL_UI_DEBUG("bundle val is NULL"); + call_data.ct_index = -1; + } + + if ((_vc_core_util_check_incall_ss_string(call_data.call_number) == EINA_TRUE) && (_vcui_doc_get_count() >= 1)) { + vcall_engine_process_incall_ss(call_data.call_number); + _vcui_view_auto_change(); + } else if (_vc_core_util_check_ss_string(call_data.call_number) == EINA_TRUE) { + __vcui_launch_ciss(call_data.call_number); + if (_vcui_doc_get_count() == 0) + elm_exit(); + return VC_NO_ERROR; + } else { + _vcui_engine_interface_process_mo_call(call_type, &call_data); + } + } + + return VC_NO_ERROR; + } else { + CALL_UI_DEBUG("wrong type!"); + elm_exit(); + return VC_NO_ERROR; + } + } + + /* AUL */ + launch_type = bundle_get_val(kb, "launch-type"); + if (launch_type != NULL) { + CALL_UI_DEBUG("launch type: [%s]", launch_type); + if (!strncmp(launch_type, "MO", 2)) { + + if (g_avoid_multi_setup == EINA_TRUE) { + CALL_UI_DEBUG("Avoid multi touch setup"); + return VC_NO_ERROR; + } + + ecore_timer_add(3.5, __vcui_avoid_multi_setup_timer_cb, ad); + g_avoid_multi_setup = EINA_TRUE; + + vcui_call_type_t call_type; + vcui_call_mo_data_t call_data; + + memset(&call_data, 0, sizeof(call_data)); + call_type = VCUI_CALL_TYPE_MO; + + tmp = bundle_get_val(kb, "number"); + if (tmp) { + CALL_UI_DEBUG("number: [%s]", tmp); + } else { + CALL_UI_DEBUG("bundle val is NULL"); + elm_exit(); + return VC_NO_ERROR; + } + snprintf(call_data.call_number, sizeof(call_data.call_number), "%s", tmp); + + tmp = bundle_get_val(kb, "ctindex"); + if (tmp) { + CALL_UI_DEBUG("ctindex: [%s]", tmp); + call_data.ct_index = atoi(tmp); + } else { + CALL_UI_DEBUG("bundle val is NULL"); + call_data.ct_index = -1; + } + + if ((_vc_core_util_check_incall_ss_string(call_data.call_number) == EINA_TRUE) && (_vcui_doc_get_count() >= 1)) { + vcall_engine_process_incall_ss(call_data.call_number); + _vcui_view_auto_change(); + } else if (_vc_core_util_check_ss_string(call_data.call_number) == EINA_TRUE) { + __vcui_launch_ciss(call_data.call_number); + if(_vcui_doc_get_count() == 0) + elm_exit(); + return VC_NO_ERROR; + } else { + _vcui_engine_interface_process_mo_call(call_type, &call_data); + } + } else if (!strncmp(launch_type, "MT", 2)) { + + vcui_call_type_t call_type; + vcui_call_mt_data_t call_data; + + memset(&call_data, 0, sizeof(call_data)); + call_type = VCUI_CALL_TYPE_MT; + + tmp = bundle_get_val(kb, "handle"); + if (tmp) { + CALL_UI_DEBUG("handle: [%s]", tmp); + call_data.call_handle = atoi(tmp); + } else { + CALL_UI_DEBUG("bundle val is NULL"); + elm_exit(); + return VC_NO_ERROR; + } + + tmp = bundle_get_val(kb, "calltype"); + if (tmp) { + CALL_UI_DEBUG("calltype: [%s]", tmp); + call_data.call_type = atoi(tmp); + } else { + CALL_UI_DEBUG("calltype is NULL but NOT mendatory"); + call_data.call_type = 0; + } + + tmp = bundle_get_val(kb, "cliindicator"); + if (tmp) { + CALL_UI_DEBUG("cliindicator: [%s]", tmp); + call_data.cli_presentation_indicator = atoi(tmp); + } else { + CALL_UI_DEBUG("cliindicator is NULL but NOT mendatory"); + call_data.cli_presentation_indicator = 0; + } + + tmp = bundle_get_val(kb, "number"); + if (tmp) { + CALL_UI_DEBUG("number: [%s]", tmp); + vcall_engine_util_strcpy(call_data.call_num, VC_PHONE_NUMBER_LENGTH_MAX, tmp); + } else { + CALL_UI_DEBUG("bundle val is NULL"); + /*return VC_NO_ERROR;*/ /*check clir mt call.*/ + } + + tmp = bundle_get_val(kb, "name_mode"); + if (tmp) { + CALL_UI_DEBUG("name_mode: [%s]", tmp); + call_data.calling_name_mode= atoi(tmp); + } else { + CALL_UI_DEBUG("name_mode is NULL but NOT mendatory"); + call_data.calling_name_mode = -1; + } + + tmp = bundle_get_val(kb, "name"); + if (tmp) { + CALL_UI_DEBUG("name: [%s]", tmp); + vcall_engine_util_strcpy(call_data.calling_name, VC_PHONE_NAME_LENGTH_MAX, tmp); + } else { + CALL_UI_DEBUG("bundle val is NULL but NOT mendatory"); + } + + tmp = bundle_get_val(kb, "rdnumber"); + if (tmp) { + CALL_UI_DEBUG("rdnumber: [%s]", tmp); + vcall_engine_util_strcpy(call_data.redirected_number, VC_PHONE_NUMBER_LENGTH_MAX, tmp); + } else { + CALL_UI_DEBUG("bundle val is NULL but NOT mendatory"); + } + + tmp = bundle_get_val(kb, "rdsubaddress"); + if (tmp) { + CALL_UI_DEBUG("rdnumber: [%s]", tmp); + vcall_engine_util_strcpy(call_data.redirected_sub_address, VC_PHONE_SUBADDRESS_LENGTH_MAX, tmp); + } else { + CALL_UI_DEBUG("bundle val is NULL but NOT mendatory"); + } + + tmp = bundle_get_val(kb, "clicause"); + if (tmp) { + CALL_UI_DEBUG("clicause: [%s]", tmp); + call_data.cli_cause = atoi(tmp); + } else { + CALL_UI_DEBUG("bundle val is NULL"); + elm_exit(); + return VC_NO_ERROR; + } + + tmp = bundle_get_val(kb, "fwded"); + if (tmp) { + CALL_UI_DEBUG("fwded: [%s]", tmp); + call_data.bfwded = atoi(tmp); + } else { + CALL_UI_DEBUG("bundle val is NULL"); + elm_exit(); + return VC_NO_ERROR; + } + + tmp = bundle_get_val(kb, "activeline"); + if (tmp) { + CALL_UI_DEBUG("activeline: [%s]", tmp); + call_data.active_line = atoi(tmp); + } else { + CALL_UI_DEBUG("bundle val is NULL"); + elm_exit(); + return VC_NO_ERROR; + } + _vcui_engine_interface_process_mt_call(call_type, &call_data); + } else if (!strncmp(launch_type, "EMERGENCY", 9)) { + + vcui_call_type_t call_type; + vcui_call_ecc_data_t call_data; + + memset(&call_data, 0, sizeof(call_data)); + call_type = VCUI_CALL_TYPE_ECC; + + tmp = bundle_get_val(kb, "number"); + if (tmp) { + CALL_UI_DEBUG("number: [%s]", tmp); + } else { + CALL_UI_DEBUG("bundle val is NULL"); + } + snprintf(call_data.call_number, sizeof(call_data.call_number), "%s", tmp); + + _vcui_engine_interface_process_ecc_call(call_type, &call_data); + + } else if (!strncmp(launch_type, "SATSETUPCALL", 12)) { + vcui_call_type_t call_type; + vcui_call_sat_data_t sat_setup_call_info; + + memset(&sat_setup_call_info, 0, sizeof(sat_setup_call_info)); + call_type = VCUI_CALL_TYPE_SAT; + + tmp = bundle_get_val(kb, "cmd_id"); + if (tmp) { + CALL_UI_DEBUG("cmd_id: [%s]", tmp); + sat_setup_call_info.command_id = atoi(tmp); + } else { + CALL_UI_DEBUG("bundle val is NULL"); + elm_exit(); + return VC_NO_ERROR; + } + + tmp = bundle_get_val(kb, "cmd_qual"); + if (tmp) { + CALL_UI_DEBUG("cmd_qual: [%s]", tmp); + sat_setup_call_info.command_qualifier = atoi(tmp); + } else { + CALL_UI_DEBUG("bundle val is NULL"); + elm_exit(); + return VC_NO_ERROR; + } + + tmp = bundle_get_val(kb, "disp_text"); + if (tmp) { + CALL_UI_DEBUG("disp_text: [%s]", tmp); + vcall_engine_util_strcpy(sat_setup_call_info.disp_text, sizeof(sat_setup_call_info.disp_text), tmp); + } else { + CALL_UI_DEBUG("bundle val is NULL"); + /*elm_exit(); + return VC_NO_ERROR;*/ + } + + tmp = bundle_get_val(kb, "call_num"); + if (tmp) { + CALL_UI_DEBUG("call_num: [%s]", tmp); + vcall_engine_util_strcpy(sat_setup_call_info.call_num, sizeof(sat_setup_call_info.call_num), tmp); + } else { + CALL_UI_DEBUG("bundle val is NULL"); + elm_exit(); + return VC_NO_ERROR; + } + + tmp = bundle_get_val(kb, "dur"); + if (tmp) { + CALL_UI_DEBUG("dur: [%s]", tmp); + sat_setup_call_info.duration = atoi(tmp); + } else { + CALL_UI_DEBUG("bundle val is NULL"); + elm_exit(); + return VC_NO_ERROR; + } + _vcui_engine_interface_process_sat_call(call_type, &sat_setup_call_info); + } else if (!strncmp(launch_type, "ECCTEST", 7)) { + + vcui_call_type_t call_type; + vcui_call_ecc_data_t call_data; + + memset(&call_data, 0, sizeof(call_data)); + call_type = VCUI_CALL_TYPE_ECC_TEST; + + _vcui_engine_interface_process_ecc_call(call_type, &call_data); + + } else if (!strncmp(launch_type, "DOWNLOADCALL", 12)) { + vcui_call_type_t call_type; + vcui_call_mo_data_t call_data; + + memset(&call_data, 0, sizeof(call_data)); + call_type = VCUI_CALL_TYPE_DOWNLOAD_CALL; + + tmp = bundle_get_val(kb, "number"); + if (tmp) { + CALL_UI_DEBUG("number: [%s]", tmp); + } else { + CALL_UI_DEBUG("bundle val is NULL"); + } + + if(tmp != NULL) { + snprintf(call_data.call_number, sizeof(call_data.call_number), "%s", tmp); + } else { + snprintf(call_data.call_number, sizeof(call_data.call_number), "%s", "116"); + } + + vcall_engine_util_strcpy(call_data.call_number, sizeof(call_data.call_number), tmp); + + _vcui_engine_interface_process_mo_call(call_type, &call_data); + } else { /*if ear jack is needed, add it*/ + CALL_UI_DEBUG("unknown launch type"); + } + CALL_UI_KPI("__vcui_app_reset done"); + return VC_NO_ERROR; + } + + CALL_UI_DEBUG("bundle data is wrong!!"); + elm_exit(); + return VC_NO_ERROR; +} + +static int __vcui_app_resume(void *data) +{ + CALL_UI_DEBUG("__vcui_app_resume().."); + + vcui_app_call_data_t *ad = (vcui_app_call_data_t *) data; + return VC_NO_ERROR; +} + +static int __vcui_app_terminate(void *data) +{ + CALL_UI_DEBUG("__vcui_app_terminate().."); + + if (_vcui_doc_get_count() >= 1) { + CALL_UI_DEBUG("WARNING!! call exists. abnormal terminate!!"); + _vcui_engine_end_all_call(); + vcall_engine_set_to_default(); + } + __vcui_fade_out_cb_routine(); + return VC_NO_ERROR; +} + +static void __vcui_cache_flush_set(Evas *e) +{ +#ifdef _CACHE_FLUSH_ + evas_image_cache_set(e, 4096 * 1024); + evas_font_cache_set(e, 512 * 1024); + + edje_file_cache_set(0); + edje_collection_cache_set(0); +#endif +} + +static void __vcui_init_view_register_function(vcui_app_call_data_t *app_data, vcui_app_call_view_id_t view_id, voice_call_view_data_t *(*view_new) ()) +{ + app_data->func_new[view_id] = view_new; +} + +void _vcui_response_volume(int vol_alert_type, int vol_level) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + if (vol_alert_type == VCUI_VOL_VOICE) { + ad->voice_vol_val = vol_level; + _vcui_set_volume(ad->vol_key_status); + } else if (vol_alert_type == VCUI_VOL_HEADSET) { + ad->bt_vol_val = vol_level; + _vcui_set_volume(ad->vol_key_status); + } else { + CALL_UI_DEBUG("ERROR"); + } +} + +void _vcui_set_volume(int key_status) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + if (_vcui_doc_get_count() == 0) { + CALL_UI_DEBUG("ignore it"); + return; + } + + if ((ad->view_st[ad->view_top]->type == VIEW_INCOMING_VIEW || ad->view_st[ad->view_top]->type == VIEW_INCOMING_LOCK_VIEW)) { + int err_code = 0; + int settings_sound_status = EINA_FALSE; + + err_code = vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &settings_sound_status); + if (settings_sound_status == EINA_FALSE) { + CALL_UI_DEBUG("ringtone vol is ignored in sound off status."); + return; + } + + if (ad->bmute_ringtone == EINA_TRUE) { + CALL_UI_DEBUG("during mute ringtone, vol will not changed"); + return; + } + + if (ad->ringtone_val < RINGTONE_MIN) { + int vol_level = _vcui_engine_get_volume_level(VCUI_VOL_RING); + if ((vol_level < RINGTONE_MIN) || (vol_level > RINGTONE_MAX)) { + CALL_UI_DEBUG("ERROR : ringtone vol:[%d]", vol_level); + return; + } + ad->ringtone_val = vol_level; + } + + CALL_UI_DEBUG("RINGTONE : Set Volume"); + if (key_status == VAL_VOL_DOWN && ad->ringtone_val > RINGTONE_MIN) { + ad->ringtone_val--; + _vcui_engine_set_volume_level(VCUI_VOL_RING, ad->ringtone_val); + } else if (key_status == VAL_VOL_UP && ad->ringtone_val < RINGTONE_MAX) { + ad->ringtone_val++; + _vcui_engine_set_volume_level(VCUI_VOL_RING, ad->ringtone_val); + } + _vcui_view_popup_vol_ringtone(ad->ringtone_val); + } else if (ad->headset_status == EINA_TRUE) { + if (ad->bt_vol_val < BT_VOL_MIN) { + CALL_UI_DEBUG("BT VOL : Get Volume"); + ad->vol_key_status = key_status; + _vcui_engine_get_volume_level(VCUI_VOL_HEADSET); + return; + } + + CALL_UI_DEBUG("BT VOL : Set Volume"); + if (key_status == VAL_VOL_DOWN && ad->bt_vol_val > BT_VOL_MIN) { /*Key Down*/ + ad->bt_vol_val--; + _vcui_engine_set_volume_level(VCUI_VOL_HEADSET, ad->bt_vol_val); + } else if (key_status == VAL_VOL_UP && ad->bt_vol_val < BT_VOL_MAX) { /*Key Up*/ + ad->bt_vol_val++; + _vcui_engine_set_volume_level(VCUI_VOL_HEADSET, ad->bt_vol_val); + } + _vcui_view_popup_vol_bt(ad->bt_vol_val); + } else { + CALL_UI_DEBUG("TAPI VOL : Get Volume"); + ad->vol_key_status = key_status; + ad->voice_vol_val = _vcui_engine_get_volume_level(VCUI_VOL_VOICE); + + CALL_UI_DEBUG("TAPI VOL : Set Volume"); + if (key_status == VAL_VOL_DOWN && ad->voice_vol_val > VOICE_VOL_MIN) { /*Key Down*/ + ad->voice_vol_val--; + _vcui_engine_set_volume_level(VCUI_VOL_VOICE, ad->voice_vol_val); + } else if (key_status == VAL_VOL_UP && ad->voice_vol_val < VOICE_VOL_MAX) { /*Key Up*/ + ad->voice_vol_val++; + _vcui_engine_set_volume_level(VCUI_VOL_VOICE, ad->voice_vol_val); + } + _vcui_view_popup_vol_voice(ad->voice_vol_val); + } + +} + +static void __vcui_fade_out_cb_routine() +{ + CALL_UI_DEBUG(".."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + if (ad->child_is == 1) { + /*system("killall dialer");*/ + } + if (ad->disp && ad->win) { + utilx_ungrab_key(ad->disp, ad->win, KEY_VOLUMEUP); + utilx_ungrab_key(ad->disp, ad->win, KEY_VOLUMEDOWN); + } + _vcui_doc_remove_all_data(); + _voicecall_dvc_proximity_sensor_deinit(); + _voicecall_dvc_control_lcd_state(VC_LCD_ON_UNLOCK); + _vcui_view_common_timer_destroy(); +} + +static int __vcui_lang_changed_cb(void *data) +{ + CALL_UI_DEBUG(".."); + + _vcui_view_auto_change(); + + return VC_NO_ERROR; +} + +static int __vcui_low_mem_cb(void *data) +{ + CALL_UI_DEBUG(".."); + + return VC_NO_ERROR; +} + +static int __vcui_low_bat_cb(void *data) +{ + CALL_UI_DEBUG(".."); + + return VC_NO_ERROR; +} + +static void __vcui_init(vcui_app_call_data_t *ad) +{ + CALL_UI_KPI("g_type_init start"); + g_type_init(); + CALL_UI_KPI("g_type_init done"); + _vcui_doc_recent_init(); + _vcui_doc_caller_list_init(); + _vcui_view_common_init(); + _vcui_engine_init(ad); + + CALL_UI_KPI("__vcui_init_view_register_function for all views start"); + __vcui_init_view_register_function(ad, VIEW_DIALLING_VIEW, _vcui_view_dialing_new); + __vcui_init_view_register_function(ad, VIEW_INCOMING_VIEW, _vcui_view_incoming_new); + __vcui_init_view_register_function(ad, VIEW_INCOMING_LOCK_VIEW, _vcui_view_incoming_lock_new); + __vcui_init_view_register_function(ad, VIEW_INCALL_ONECALL_VIEW, _vc_ui_view_single_call_new); + __vcui_init_view_register_function(ad, VIEW_INCALL_MULTICALL_SPLIT_VIEW, _vcui_view_multi_call_split_new); + __vcui_init_view_register_function(ad, VIEW_INCALL_MULTICALL_CONF_VIEW, _vcui_view_multi_call_conf_new); + __vcui_init_view_register_function(ad, VIEW_INCALL_MULTICALL_LIST_VIEW, _vcui_view_multi_call_list_new); + __vcui_init_view_register_function(ad, VIEW_INCALL_KEYPAD_VIEW, _vcui_view_keypad_new); + __vcui_init_view_register_function(ad, VIEW_ENDCALL_VIEW, _vcui_view_callend_new); + CALL_UI_KPI("__vcui_init_view_register_function for all views done"); + + ad->view_top = -1; + ad->view_before_top = -1; + ad->view_before_reject_view = -1; + ad->headset_status = (int)_vcui_is_headset_conected(); + ad->speaker_status = EINA_FALSE; + ad->mute_status = EINA_FALSE; + ad->child_is = -1; + ad->show_flag = WIN_HIDE; + ad->brecord_voice = 0; + ad->ringtone_val = -1; + ad->voice_vol_val = -1; + ad->bt_vol_val = -1; + ad->call_end_type = CALL_END_TYPE_NONE; +} + +char *_vcui_get_endcause_string(int end_cause, char *data) +{ + char *string_id = NULL; + CALL_UI_DEBUG("end type : %d", end_cause); + switch (end_cause) { + case VC_ENGINE_ENDCAUSE_USER_UNAVAILABLE: + string_id = _("IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE"); + break; + case VC_ENGINE_ENDCAUSE_UNASSIGNED_NUMBER: + string_id = _("IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST"); + break; + case VC_ENGINE_ENDCAUSE_USER_DOESNOT_RESPOND: + string_id = _("IDS_CALL_BODY_NO_ANSWER"); + break; + case VC_ENGINE_ENDCAUSE_CALL_DISCONNECTED: + string_id = _("IDS_CALL_BODY_DISCONNECTED"); + break; + case VC_ENGINE_ENDCAUSE_CALL_ENDED: + string_id = _("IDS_CALL_BODY_CALLENDED"); + break; + case VC_ENGINE_ENDCAUSE_CALL_SERVICE_NOT_ALLOWED: + string_id = _("IDS_CALL_POP_SERVICE_NOT_ALLOWED"); + break; + case VC_ENGINE_ENDCAUSE_CALL_BARRED: + string_id = _("IDS_CALL_POP_CALL_BARRED"); + break; + case VC_ENGINE_ENDCAUSE_NO_SERVICE: + string_id = _("IDS_CALL_POP_NOSERVICE"); + break; + case VC_ENGINE_ENDCAUSE_NW_BUSY: + string_id = _("IDS_CALL_POP_NETWORKBUSY"); + break; + case VC_ENGINE_ENDCAUSE_NW_FAILED: + string_id = _("IDS_CALL_POP_NETWORK_UNAVAILABLE"); + break; + case VC_ENGINE_ENDCAUSE_SERVICE_TEMP_UNAVAILABLE: + string_id = _("IDS_CALL_BODY_SERVICE_UNAVAILABLE"); + break; + case VC_ENGINE_ENDCAUSE_NO_ANSWER: + string_id = _("IDS_CALL_BODY_NO_ANSWER"); + break; + case VC_ENGINE_ENDCAUSE_NO_CREDIT: + string_id = _("IDS_CALL_POP_NOCREDITLEFT"); + break; + case VC_ENGINE_ENDCAUSE_REJECTED: + string_id = _("IDS_CALL_BODY_CALL_REJECTED"); + break; + case VC_ENGINE_ENDCAUSE_USER_BUSY: + string_id = _("IDS_CALL_POP_USER_BUSY"); + break; + case VC_ENGINE_ENDCAUSE_WRONG_GROUP: + string_id = _("IDS_CALL_POP_WRONG_GROUP"); + break; + case VC_ENGINE_ENDCAUSE_INVALID_NUMBER_FORMAT: + string_id = _("IDS_CALL_POP_CAUSE_WRONG_NUMBER"); + break; + case VC_ENGINE_ENDCAUSE_CALL_NOT_ALLOWED: + string_id = _("IDS_CALL_POP_CALLNOTCALLOWED"); + break; + case VC_ENGINE_ENDCAUSE_TAPI_ERROR: + string_id = _("IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR"); + break; + case VC_ENGINE_ENDCAUSE_CALL_FAILED: + string_id = _("IDS_CALL_POP_CALLFAILED"); + break; + case VC_ENGINE_ENDCAUSE_NUMBER_CHANGED: + string_id = _("IDS_CALL_BODY_NUMBER_CHANGED"); + break; + case VC_ENGINE_ENDCAUSE_IMEI_REJECTED: + string_id = _("IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM"); + break; + case VC_ENGINE_ENDCAUSE_NO_USER_RESPONDING: /**< User not responding */ + case VC_ENGINE_ENDCAUSE_USER_ALERTING_NO_ANSWER: /**< User Alerting No Answer */ + default: + string_id = _("IDS_CALL_BODY_CALLENDED"); + break; + } + vcall_engine_util_strcpy(data, VC_DATA_LENGTH_MAX, string_id); + return data; +} + +void _vcui_cache_flush() +{ +#ifdef _CACHE_FLUSH_ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + evas_font_cache_flush(ad->evas); + evas_image_cache_flush(ad->evas); + + edje_file_cache_flush(); + edje_collection_cache_flush(); + + evas_render_idle_flush(ad->evas); +#endif +} + +int _vcui_is_idle_lock() +{ + int lock_state; + int ret = vconf_get_int(VCONFKEY_IDLE_LOCK_STATE, &(lock_state)); + if (ret == -1) { + CALL_UI_DEBUG("Cannot get vconf key"); + } + + if (lock_state == VCONFKEY_IDLE_LOCK) + return CALL_LOCK; + else + return CALL_UNLOCK; +} + +unsigned long _vcui_get_diff_now(time_t start_time) +{ + time_t curr_time; + unsigned long call_duration_in_sec = 0; + curr_time = time(&curr_time); + call_duration_in_sec = curr_time - start_time; + return call_duration_in_sec; +} + +gboolean _vcui_is_gcf_mode(void) +{ + gboolean bgcf_status = EINA_FALSE; + int ret = -1; + + ret = vconf_get_int(VCONFKEY_ADMIN_GCF_TEST, &bgcf_status); + if (0 == ret) { + CALL_UI_DEBUG("bgcf_status = [%d]\n", bgcf_status); + } else { + CALL_UI_DEBUG("vconf_get_int failed..[%d]\n", ret); + } + + return bgcf_status; +} + +gboolean _vcui_is_headset_conected(void) +{ + int bt_connected = VCONFKEY_BT_DEVICE_NONE; + Eina_Bool ret = EINA_FALSE; + + ret = vconf_get_int(VCONFKEY_BT_DEVICE, &bt_connected); + if (0 == ret) { + CALL_UI_DEBUG("bt_connected = [0x%x] ", bt_connected); + } else { + CALL_UI_DEBUG("vconf_get_int failed..[%d]", ret); + } + + return (VCONFKEY_BT_DEVICE_HEADSET_CONNECTED == (bt_connected & VCONFKEY_BT_DEVICE_HEADSET_CONNECTED)) ? EINA_TRUE : EINA_FALSE; +} + +gboolean _vcui_is_headset_switch_on(void) +{ + int bt_status = VCONFKEY_BT_STATUS_OFF; + Eina_Bool ret = EINA_FALSE; + + ret = vconf_get_int(VCONFKEY_BT_STATUS, &bt_status); + if (0 == ret) { + CALL_UI_DEBUG("bt_status = [0x%x] ", bt_status); + } else { + CALL_UI_DEBUG("vconf_get_int failed..[%d]", ret); + } + + return (VCONFKEY_BT_STATUS_ON == (bt_status & VCONFKEY_BT_STATUS_ON)) ? EINA_TRUE : EINA_FALSE; +} + +gboolean _vcui_is_answering_mode_on(void) +{ + gboolean bAnswerMode = EINA_FALSE; + Eina_Bool ret = EINA_FALSE; + + ret = vconf_get_bool(VCONFKEY_CISSAPPL_ANSWERING_KEY_BOOL, &bAnswerMode); + if (0 == ret) { + CALL_UI_DEBUG("bAnswerMode = [%d] \n", bAnswerMode); + } else { + CALL_UI_DEBUG("vconf_get_int failed..[%d]\n", ret); + } + + return bAnswerMode; +} + +gboolean _vcui_is_powerkey_mode_on(void) +{ + gboolean bPowerkeyMode = EINA_FALSE; + Eina_Bool ret = EINA_FALSE; + + ret = vconf_get_bool(VCONFKEY_CISSAPPL_POWER_KEY_ENDS_CALL_BOOL, &bPowerkeyMode); + if (0 == ret) { + CALL_UI_DEBUG("bPowerkeyMode = [%d] \n", bPowerkeyMode); + } else { + CALL_UI_DEBUG("vconf_get_int failed..[%d]\n", ret); + } + + return bPowerkeyMode; +} + +gboolean _vcui_is_phonelock_status() +{ + gboolean b_phonelock = EINA_FALSE; + if (!vconf_get_bool(VCONFKEY_SETAPPL_STATE_POWER_ON_LOCK_BOOL, &b_phonelock)) { + CALL_UI_DEBUG("b_phonelock:[%d]", b_phonelock); + return b_phonelock; + } else { + CALL_UI_DEBUG("get VCONFKEY_SETAPPL_STATE_POWER_ON_LOCK_BOOL failed.."); + return EINA_FALSE; + } +} + +void _vcui_add_calllog(int type, call_data_t *data, int boutgoing_end) +{ + CALL_UI_DEBUG("type = [0x%x] ", type); + CTSvalue *plog; + time_t current_time; + + if (data == NULL) + return; + contacts_svc_connect(); + + current_time = time(NULL); + + plog = contacts_svc_value_new(CTS_VALUE_PHONELOG); + contacts_svc_value_set_str(plog, CTS_PLOG_VAL_NUMBER_STR, data->call_num); + contacts_svc_value_set_int(plog, CTS_PLOG_VAL_LOG_TIME_INT, (int)current_time); + contacts_svc_value_set_int(plog, CTS_PLOG_VAL_LOG_TYPE_INT, type); + contacts_svc_value_set_int(plog, CTS_PLOG_VAL_RELATED_ID_INT, data->contact_id); + + if ((type == CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN) || (type == CTS_PLOG_TYPE_VOICE_REJECT) || + (type == CTS_PLOG_TYPE_VOICE_BLOCKED) || (boutgoing_end == EINA_TRUE)) { + contacts_svc_value_set_int(plog, CTS_PLOG_VAL_DURATION_INT, 0); + } else { + contacts_svc_value_set_int(plog, CTS_PLOG_VAL_DURATION_INT, _vcui_get_diff_now(data->start_time)); + } + contacts_svc_insert_phonelog(plog); + + contacts_svc_value_free(plog); + contacts_svc_disconnect(); + + /* vconf set & quickpanel noti (for missed call) */ + if (type == CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN) { + char szname[255] = { 0, }; + int ret; + notification_h noti = NULL; + notification_error_e noti_err = NOTIFICATION_ERROR_NONE; + + if (strlen((char *)data->call_display) == 0) { + snprintf(szname, sizeof(szname), "%s", data->call_num); + } else { + snprintf(szname, sizeof(szname), "%s", data->call_display); + } + CALL_UI_DEBUG("szname:[%s]", szname); + + noti = notification_new(NOTIFICATION_TYPE_NOTI, __VCUI_NOTIFICATION_CALL_GROUP_ID, NOTIFICATION_PRIV_ID_NONE); + if(noti == NULL) { + CALL_UI_DEBUG("Fail to notification_new\n"); + return; + } + + noti_err = notification_set_application(noti, DIALER_PKG); + if(noti_err != NOTIFICATION_ERROR_NONE) { + CALL_UI_DEBUG("Fail to notification_set_application : %d\n", noti_err); + } + + bundle *args = bundle_create(); + + bundle_add(args, "logs", "missed_call"); + noti_err = notification_set_args(noti, args, NULL); + if(noti_err != NOTIFICATION_ERROR_NONE) { + CALL_UI_DEBUG("Fail to notification_set_args : %d\n", noti_err); + } + bundle_free(args); + + noti_err = notification_set_time(noti, current_time); + if(noti_err != NOTIFICATION_ERROR_NONE) { + CALL_UI_DEBUG("Fail to notification_set_icon : %d\n", noti_err); + } + + noti_err = notification_set_text(noti, NOTIFICATION_TEXT_TYPE_TITLE, szname, szname, NOTIFICATION_VARIABLE_TYPE_NONE); + if(noti_err != NOTIFICATION_ERROR_NONE) { + CALL_UI_DEBUG("Fail to notification_set_title : %d\n", noti_err); + } + + CALL_UI_DEBUG("data->call_file_path(%s)",data->call_file_path); + if (strlen(data->call_file_path) > 0) { + noti_err = notification_set_image(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL, data->call_file_path); + if(noti_err != NOTIFICATION_ERROR_NONE) { + CALL_UI_DEBUG("Fail to notification_set_title : %d\n", noti_err); + } + } + + noti_err = notification_insert(noti, NULL); + if(noti_err != NOTIFICATION_ERROR_NONE) { + CALL_UI_DEBUG("Fail to notification_set_text_domain\n"); + } + + noti_err = notification_free(noti); + if(noti_err != NOTIFICATION_ERROR_NONE) { + CALL_UI_DEBUG("Fail to notification_set_text_domain\n"); + } + } +} + +void _vcui_raise_main_win() +{ + CALL_UI_DEBUG(".."); + + vcui_app_call_data_t *ad = _vcui_get_app_data(); + if (ad == NULL) { + CALL_UI_DEBUG("App data is NULL"); + return; + } + if (ad->win_main == NULL) { + CALL_UI_DEBUG("Main Window is NULL"); + return; + } + + elm_win_activate(ad->win_main); + _vcui_show_main_ui_set_flag(); + /*view_refresh_now();*/ + +} + +int _vcui_check_valid_eo(Evas_Object *eo, char *v_name) +{ + /*CALL_UI_DEBUG("eo addr:[%p], v_name:[%s]", eo, v_name);*/ + const char *obj_name = evas_object_name_get(eo); + if (obj_name == NULL) { + CALL_UI_DEBUG("obj_name is NULL!!. eo addr:[%p], v_name:[%s]", eo, v_name); + return VC_ERROR; + } + if (strncmp(obj_name, v_name, strlen(obj_name)) == 0) { + return VC_NO_ERROR; + } else { + CALL_UI_DEBUG("different name !! "); + return VC_ERROR; + } +} + +vcui_app_call_data_t *_vcui_get_app_data() +{ + return &global_ad; +} + +void _vcui_show_main_ui_set_flag() +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + if (ad->show_flag == WIN_HIDE) { + CALL_UI_DEBUG("show_flag : WIN_SHOW"); + evas_object_show(ad->win_main); + ad->show_flag = WIN_SHOW; + } +} + +void __vcui_hide_main_ui_set_flag() +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + CALL_UI_DEBUG("show_flag: WIN_HIDE"); + evas_object_hide(ad->win_main); + ad->show_flag = WIN_HIDE; +} + +Evas_Object *_vcui_load_edj(Evas_Object *parent, const char *file, const char *group) +{ + Evas_Object *eo; + int r; + + eo = elm_layout_add(parent); + if (eo) { + r = elm_layout_file_set(eo, file, group); + if (!r) { + evas_object_del(eo); + CALL_UI_DEBUG("ERROR!!"); + return NULL; + } + + evas_object_size_hint_weight_set(eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + } + + return eo; +} + +int main(int argc, char *argv[]) +{ + CALL_UI_DEBUG("voice call ui main().."); + + struct appcore_ops ops = { + .create = __vcui_app_create, + .terminate = __vcui_app_terminate, + .pause = __vcui_app_pause, + .resume = __vcui_app_resume, + .reset = __vcui_app_reset, + }; + + memset(&global_ad, 0, sizeof(vcui_app_call_data_t)); + + ops.data = &global_ad; + + CALL_UI_KPI("__vcui_init start"); + __vcui_init(&global_ad); + CALL_UI_KPI("__vcui_init done"); + + appcore_set_i18n(PACKAGE, LOCALEDIR); + + return appcore_efl_main(PACKAGE, &argc, &argv, &ops); +} + +static Eina_Bool __vcui_avoid_multi_setup_timer_cb(void *data) +{ + CALL_UI_DEBUG(".."); + + g_avoid_multi_setup = EINA_FALSE; + + return ECORE_CALLBACK_CANCEL; +} + diff --git a/ui/vcui-application.h b/ui/vcui-application.h new file mode 100755 index 0000000..85386f5 --- /dev/null +++ b/ui/vcui-application.h @@ -0,0 +1,318 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VCUI_MAIN_H_ +#define __VCUI_MAIN_H_ + +#include + +#include + +#include + +#ifndef Eina_Bool +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "appcore-efl.h" + +#include "vcui-doc-launch.h" +#include "voice-call-engine-msg.h" + +#include "vcui-app-data.h" +#include "vcui-document.h" +#include "vcui-view-choice.h" +#include "vcui-engine-interface.h" +#include "vcui-view-common.h" +#include "vcui-view-elements.h" +#include "vcui-view-popup.h" + +#include + +#include "ui-gadget.h" /*for UG_INIT_EFL() & ug usage*/ + +#include "libintl.h" + +#define DIALER_PKG "org.tizen.phone" +#define CONTACTS_PKG "org.tizen.contacts" + +#if !defined(PACKAGE) +# define PACKAGE "voice-call-ui" +#endif + +#if !defined(LOCALEDIR) +# define LOCALEDIR "/opt/apps/org.tizen.call/res/locale" +#endif + +#if !defined(EDJDIR) +# define EDJDIR "/opt/apps/org.tizen.call/res/edje" +#endif + +#if !defined(IMGDIR) +# define IMGDIR "/opt/apps/org.tizen.call/res/images" +#endif + +#if !defined(MEDIADIR) +# define MEDIADIR "/opt/apps/org.tizen.call/res/media" +#endif + +#if !defined(ICONDIR) +# define ICONDIR "/opt/apps/org.tizen.call/res/icons/default/small" +#endif + +#define EDJ_NAME EDJDIR"/voice-call-ui.edj" +#define CALL_THEME EDJDIR"/call_theme.edj" + +#define GRP_MTVIEW "mt-view" +#define GRP_MOVIEW "mo-view" +#define GRP_INCALL "incall" +#define GRP_MTLOCK "mtlock" +#define GRP_KEYPAD "keypad" +#define GRP_MULTICALL_SPLIT "multicall-split" +#define GRP_MULTICALL_SPLIT2 "multicall-split2" +#define GRP_MULTICALL_CONF "multicall-conf" +#define GRP_MULTICALL "multicall-list" +#define GRP_UG_EFFECT "ug_effect" +#define GRP_END_SINGLECALL "end-singlecall" +#define GRP_END_CONFCALL "end-confcall" + +#define GRP_LOCK_ACCEPT "lock_accept" +#define GRP_LOCK_REJECT "lock_reject" + +#define QP_NOIMG_ICON IMGDIR"/vc_qp_caller_ID.png" +#define QP_CONF_ICON IMGDIR"/vc_qp_caller_ID_group.png" +#define NOIMG_ICON IMGDIR"/vc_normal_caller_ID.png" +#define CONF_ICON IMGDIR"/vc_normal_caller_ID_group.png" +#define PRIVATE_ICON IMGDIR"/vc_conference_private.png" +#define HOLD_ICON IMGDIR"/vc_icon_hold.png" +#define UNHOLD_ICON IMGDIR"/vc_icon_unhold.png" +#define KEYPAD_ICON IMGDIR"/vc_keypad_icon.png" +#define CONTACT_ICON IMGDIR"/vc_contact_icon.png" +#define ADDCALL_ICON IMGDIR"/vc_add_icon.png" +#define JOIN_ICON IMGDIR"/vc_join_icon.png" +#define SPEAKER_ICON IMGDIR"/vc_speaker_icon.png" +#define MUTE_ICON IMGDIR"/vc_mute_icon.png" +#define PLAY_ICON IMGDIR"/vc_icon_play.png" +#define PAUSE_ICON IMGDIR"/vc_icon_pause.png" +#define MORE_ICON IMGDIR"/vc_btn_more.png" +#define CONF_CALL_END_ICON IMGDIR"/vc_icon_conf_call_end.png" +#define CALLING_NAME_BG_IMAGE IMGDIR"/vc_calling_name_BG_image.png" + +#define HOLD_DISABLED_ICON IMGDIR"/vc_icon_hold_dim.png" +#define UNHOLD_DISABLED_ICON IMGDIR"/vc_icon_unhold_dim.png" +#define KEYPAD_DISABLED_ICON IMGDIR"/vc_keypad_icon_dim.png" +#define CONTACT_DISABLED_ICON IMGDIR"/vc_contact_icon_dim.png" +#define ADDCALL_DISABLED_ICON IMGDIR"/vc_add_icon_dim.png" +#define JOIN_DISABLED_ICON IMGDIR"/vc_join_icon_dim.png" +#define SPEAKER_DISABLED_ICON IMGDIR"/vc_speaker_icon_dim.png" +#define MUTE_DISABLED_ICON IMGDIR"/vc_mute_icon_dim.png" +#define CONF_LIST_HOLD_ICON IMGDIR"/vc_icon_conf_list_hold.png" +#define CONF_LIST_UNHOLD_ICON IMGDIR"/vc_icon_conf_list_unhold.png" + +#define VOLUME_ICON IMGDIR"/vc_volume_icon.png" +#define VOLUME_MUTE_ICON IMGDIR"/vc_volume_mute_icon.png" + +#define NVAI_CONTROL_OTHER_ICON IMGDIR"/vc_reject_with_msg_header_icon_others.png" + +#define MINI_CONTROLLER_WIDTH (480) +#define MINI_CONTROLLER_HEIGHT (42) + +#define DEF_BUF_LEN (128) +#define DEF_BUF_LEN_LONG (256) + +#define VAL_VOL_UP (1) +#define VAL_VOL_DOWN (0) + +#define RINGTONE_MIN (0) +#define RINGTONE_MAX (15) +#define VOICE_VOL_MIN (1) +#define VOICE_VOL_MAX (7) /* It must change to 6 later.. */ +#define BT_VOL_MIN (1) +#define BT_VOL_MAX (15) + +#define RINGTONE_LONGPRESS_MUTE_TIMEOUT 0.7 +#define VOLUME_KEY_LONG_PRESS_TIMEOUT 0.1 + +#define POPUP_TIMEOUT_SHORT (2.0) +#define POPUP_TIMEOUT_NORMAL (3.0) +#define POPUP_TIMEOUT_LONG (5.0) +#define POPUP_TIMEOUT_VERY_LONG (10.0) + +#define TIMER_TIMEOUT_0_1_SEC (0.1) +#define TIMER_TIMEOUT_0_3_SEC (0.3) +#define TIMER_TIMEOUT_0_5_SEC (0.5) +#define TIMER_TIMEOUT_1_SEC (1.0) +#define TIMER_TIMEOUT_2_SEC (2.0) +#define TIMER_TIMEOUT_4_SEC (4.0) + +#define BLUR_VALUE 30 +#define IMG_TYPE_FULL 1 +#define IMG_TYPE_WALLPAPER 2 +#define IMG_TYPE_BLUR 3 + +#define BG_DEFAULT_PATH "/opt/media/Images and videos/Wallpapers/Home_default.png" + +#ifndef EINA_TRUE +#define EINA_TRUE 1 +#endif + +#ifndef EINA_FALSE +#define EINA_FALSE 0 +#endif + +#ifdef CALL_DEBUG_ON_DLOG +#define CALL_UI_DEBUG(frmt, args...) do { LOG(LOG_DEBUG, TAG_CALL, "[vcui] [%s:%d] "frmt"\n", __func__, __LINE__, ##args); } while (0) +#define CALL_UI_KPI(frmt, args...) do { LOG(LOG_DEBUG, TAG_CALL_LAUNCH, "[VC_KPI] [%s:%d] "frmt"\n", __func__, __LINE__, ##args); } while (0) +#else +#define CALL_UI_DEBUG(args...) +#endif + +#ifndef retv_if +#define retv_if(expr, val) do { \ + if (expr) { \ + CALL_UI_DEBUG("(%s) -> %s() return", #expr, __FUNCTION__); \ + return (val); \ + } \ + } while (0) +#endif + +#ifndef retvm_if +#define retvm_if(expr, val, fmt, arg...) do { \ + if (expr) { \ + CALL_UI_DEBUG(fmt, ##arg); \ + CALL_UI_DEBUG("(%s) -> %s() return", #expr, __FUNCTION__); \ + return (val); \ + } \ + } while (0) +#endif + +#ifndef VCUI_RETURN_IF_FAIL +#define VCUI_RETURN_IF_FAIL(check_condition) \ + if (!(check_condition)) return; +#endif + +#ifndef VCUI_RETURN_FALSE_IF_FAIL +#define VCUI_RETURN_FALSE_IF_FAIL(check_condition) \ + if (!(check_condition)) return EINA_FALSE; +#endif + +#ifndef VCUI_RETURN_VALUE_IF_FAIL +#define VCUI_RETURN_VALUE_IF_FAIL(check_condition, value) \ + if (!(check_condition)) return value; +#endif + +#ifndef VCUI_RETURN_NULL_IF_FAIL +#define VCUI_RETURN_NULL_IF_FAIL(check_condition) \ + if (!(check_condition)) return NULL; +#endif + +#ifndef VCUI_RETURN_ZERO_IF_FAIL +#define VCUI_RETURN_ZERO_IF_FAIL(check_condition) \ + if (!(check_condition)) return 0; +#endif + +#ifndef VCUI_RETURN_INVALID_IF_FAIL +#define VCUI_RETURN_INVALID_IF_FAIL(check_condition) \ + if (!(check_condition)) return -1; +#endif + +#ifndef VCUI_RETURN_VALUE_IF_NOT_IN_RANGE +#define VCUI_RETURN_VALUE_IF_NOT_IN_RANGE(value, min_value, max_value, ret_val) \ + if ((value < min_value) || (value > max_value)) return ret_val; +#endif + +#ifndef _EDJ +#define _EDJ(obj) elm_layout_edje_get(obj) +#endif + +#define _EVAS_OBJ_DEL(obj) if (obj) \ + { \ + evas_object_del(obj); \ + obj = NULL; \ + } + +struct text_part { + char *part; + char *msgid; +}; + +typedef enum _voice_call_bg_type_t { + BG_HIDE, + BG_SHOW +} voice_call_bg_type_t; + +typedef enum { + CALL_END_TYPE_NONE = -1, + CALL_END_TYPE_SINGLE_CALL, + CALL_END_TYPE_CONF_CALL, +} voice_call_end_type_t; + +/************************************************************************************/ +void _create_main_ui_set_flag(); +void _create_main_ui_real(); +void _vcui_show_main_ui_set_flag(); +void __vcui_hide_main_ui_set_flag(); + +void _vcui_determine_background_show_hide(); + +void _vcui_cache_flush(); +vcui_app_call_data_t *_vcui_get_app_data(); +int _vcui_is_idle_lock(); + +gboolean _vcui_is_gcf_mode(void); +gboolean _vcui_is_headset_conected(void); +gboolean _vcui_is_headset_switch_on(void); +gboolean _vcui_is_answering_mode_on(void); +gboolean _vcui_is_powerkey_mode_on(void); +gboolean _vcui_is_phonelock_status(void); + +void _vcui_add_calllog(int type, call_data_t *data, int boutgoing_end); + +void _vcui_response_volume(int vol_alert_type, int vol_level); +void _vcui_set_volume(int key_status); + +void _vcui_raise_main_win(); +int _vcui_check_valid_eo(Evas_Object *eo, char *v_name); + +unsigned long _vcui_get_diff_now(time_t start_time); + +char *_vcui_get_endcause_string(int end_cause, char *data); + +Evas_Object *_vcui_load_edj(Evas_Object *parent, const char *file, const char *group); + +#endif /* __VCUI_MAIN_H_ */ diff --git a/ui/vcui-doc-launch.c b/ui/vcui-doc-launch.c new file mode 100755 index 0000000..d58ea02 --- /dev/null +++ b/ui/vcui-doc-launch.c @@ -0,0 +1,453 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "contacts-ug.h" + +#define MSG_COMPOSER_UG "msg-composer-efl" +#define MSG_PKG "org.tizen.message" +#define ADD_TO_CONTACTS_UG "contacts-details-efl" + +struct vcui_ug_priv_data *local_priv_data = NULL; + +#define COMMON_FUNCTIONS +#ifdef COMMON_FUNCTIONS +static void __vcui_doc_launch_ug_common_back_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *navi = data; + elm_naviframe_item_pop(navi); +} + +static void __vcui_doc_launch_ug_common_hide_effect_finished(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + struct vcui_ug_priv_data *temp_priv_data = (struct vcui_ug_priv_data *)data; + + Evas_Object *base; + base = temp_priv_data->need_layout; + + if (temp_priv_data->need_ug != NULL) { + CALL_UI_DEBUG("__vcui_doc_launch_ug_common_hide_effect_finished start"); + + if (base != NULL) + evas_object_hide(base); + + elm_object_part_content_unset(base, "elm.swallow.content"); + + if (temp_priv_data->on_destroy_callback != NULL) + temp_priv_data->on_destroy_callback(temp_priv_data->destroy_callback_param); + + ug_destroy((struct ui_gadget *)(temp_priv_data->need_ug)); + + free(temp_priv_data); + local_priv_data = NULL; + + evas_object_del(base); + CALL_UI_DEBUG("__vcui_doc_launch_ug_common_hide_effect_finished end"); + } +} + +static void __vcui_doc_launch_ug_common_layout_cb(struct ui_gadget *ug, enum ug_mode mode, void *priv) +{ + Evas_Object *base, *win; + struct vcui_ug_priv_data *temp_priv_data = (struct vcui_ug_priv_data *)priv; + + if (!ug) + return; + + base = ug_get_layout(ug); + if (!base) + return; + +#ifdef _LOCAL_UG_EFFECT_ + Evas_Object *ly = elm_layout_add(temp_priv_data->need_parent); + win = ug_get_window(); + elm_win_resize_object_add(win, ly); + elm_layout_file_set(ly, EDJ_NAME, "ug_effect"); + elm_object_part_content_set(ly, "elm.swallow.content", base); + evas_object_show(ly); + temp_priv_data->need_layout = ly; + + edje_object_signal_callback_add(elm_layout_edje_get(ly), "elm,action,hide,finished", "", __vcui_doc_launch_ug_common_hide_effect_finished, temp_priv_data); + edje_object_signal_emit(elm_layout_edje_get(ly), "elm,state,show", ""); +#else + evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, base); + evas_object_show(base); +#endif +} + +static void __vcui_doc_launch_ug_common_destroy_cb(struct ui_gadget *ug, void *priv) +{ + CALL_UI_DEBUG(""); + struct vcui_ug_priv_data *temp_priv_data = NULL; + if(priv != NULL) + temp_priv_data = (struct vcui_ug_priv_data *)priv; + else + temp_priv_data = local_priv_data; + +#ifdef _LOCAL_UG_EFFECT_ + if (temp_priv_data->need_navi != NULL) { + Evas_Object *base; + base = ug_get_layout(ug); + + if (ug != NULL) { + ug_destroy(ug); + + if (temp_priv_data->on_destroy_callback != NULL) + temp_priv_data->on_destroy_callback(temp_priv_data->destroy_callback_param); + + + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)(temp_priv_data->need_ug_lists); + if (pugs_array != NULL) { + pugs_array->ug_lists = eina_list_remove(pugs_array->ug_lists, temp_priv_data->need_ug); + pugs_array->ug_count = pugs_array->ug_count - 1; + pugs_array->last_ug_type = VCUI_UG_TYPE_NOE; + } + free(temp_priv_data); + local_priv_data = NULL; + } + CALL_UI_DEBUG("__vcui_doc_launch_ug_common_destroy_cb"); + } else { + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)(temp_priv_data->need_ug_lists); + CALL_UI_DEBUG("pugs_array(0x%x)"); + if (pugs_array != NULL) { + pugs_array->ug_lists = eina_list_remove(pugs_array->ug_lists, temp_priv_data->need_ug); + pugs_array->ug_count = pugs_array->ug_count - 1; + pugs_array->last_ug_type = VCUI_UG_TYPE_NOE; + } + edje_object_signal_emit(elm_layout_edje_get(temp_priv_data->need_layout), "elm,state,hide", ""); + CALL_UI_DEBUG("Send Hide"); + } +#else + Evas_Object *base; + base = ug_get_layout(ug); + + if (ug != NULL) { + ug_destroy(ug); + + if (temp_priv_data->on_destroy_callback != NULL) + temp_priv_data->on_destroy_callback(temp_priv_data->destroy_callback_param); + + + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)(temp_priv_data->need_ug_lists); + if (pugs_array != NULL) { + pugs_array->ug_lists = eina_list_remove(pugs_array->ug_lists, temp_priv_data->need_ug); + pugs_array->ug_count = pugs_array->ug_count - 1; + pugs_array->last_ug_type = VCUI_UG_TYPE_NOE; + } + free(temp_priv_data); + local_priv_data = NULL; + } + CALL_UI_DEBUG("__vcui_doc_launch_ug_common_destroy_cb"); +#endif +} +#endif + +static void __vcui_doc_launch_ug_contact_list_layout_cb(struct ui_gadget *ug, enum ug_mode mode, void *priv) +{ + __vcui_doc_launch_ug_common_layout_cb(ug, mode, priv); + CALL_UI_DEBUG("__vcui_doc_launch_ug_contact_list_layout_cb success"); +} + +static void __vcui_doc_launch_ug_contact_list_destroy_cb(struct ui_gadget *ug, void *priv) +{ + __vcui_doc_launch_ug_common_destroy_cb(ug, priv); + CALL_UI_DEBUG("__vcui_doc_launch_ug_contact_list_destroy_cb success"); +} + +static void __vcui_doc_launch_ug_contact_list_result_cb(struct ui_gadget *ug, bundle *result, void *priv) +{ + CALL_UI_DEBUG("__vcui_doc_launch_ug_contact_list_result_cb nothing"); +} + +void _vcui_doc_launch_contact_list_ug(void *parent_ui_gadget, void *navi, void *parent, void (*on_start_callback) (void *), void (*on_destroy_callback) (void *), void *callback_param, void *ugs_array_data) +{ + CALL_UI_DEBUG("_vcui_doc_launch_contact_list_ug start"); + bundle *bd = bundle_create(); + + if (bd == NULL) { + CALL_UI_DEBUG("bundle_craete() return NULL"); + return; + } + + bundle_add(bd, "type", "1"); + + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)ugs_array_data; + if (pugs_array->last_ug_type == VCUI_UG_TYPE_CONTACT_LIST) { + CALL_UI_DEBUG("launch exit because of same ug execution"); + bundle_free(bd); + return; + } + struct ug_cbs cbs = { 0, }; + cbs.layout_cb = __vcui_doc_launch_ug_contact_list_layout_cb; + cbs.destroy_cb = __vcui_doc_launch_ug_contact_list_destroy_cb; + cbs.result_cb = __vcui_doc_launch_ug_contact_list_result_cb; + + struct vcui_ug_priv_data *temp_priv_data = malloc(sizeof(struct vcui_ug_priv_data)); + if (temp_priv_data == NULL) { + CALL_UI_DEBUG("malloc error.\n"); + bundle_free(bd); + return; + } + temp_priv_data->on_start_callback = on_start_callback; + temp_priv_data->on_destroy_callback = on_destroy_callback; + temp_priv_data->destroy_callback_param = callback_param; + temp_priv_data->need_navi = navi; + temp_priv_data->need_parent = parent; + temp_priv_data->need_ug_lists = ugs_array_data; + local_priv_data = cbs.priv = temp_priv_data; + + struct ui_gadget *ug = ug_create(parent_ui_gadget, PKGNAME_CONTACT_UG, UG_MODE_FULLVIEW, bd, &cbs); + temp_priv_data->need_ug = ug; + if (ug == NULL) { + free(temp_priv_data); + local_priv_data = NULL; + CALL_UI_DEBUG("_vcui_doc_launch_contact_list_ug fail"); + } else { + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)ugs_array_data; + pugs_array->ug_count = pugs_array->ug_count + 1; + pugs_array->last_ug_type = VCUI_UG_TYPE_CONTACT_LIST; + pugs_array->ug_lists = eina_list_append(pugs_array->ug_lists, (void *)ug); + } + bundle_free(bd); + CALL_UI_DEBUG("_vcui_doc_launch_contact_list_ug end"); +} + +static void __vcui_doc_launch_ug_phoneui_layout_cb(struct ui_gadget *ug, enum ug_mode mode, void *priv) +{ + __vcui_doc_launch_ug_common_layout_cb(ug, mode, priv); + CALL_UI_DEBUG("__vcui_doc_launch_ug_phoneui_layout_cb success"); +} + +static void __vcui_doc_launch_ug_phoneui_destroy_cb(struct ui_gadget *ug, void *priv) +{ + __vcui_doc_launch_ug_common_destroy_cb(ug, priv); + CALL_UI_DEBUG("__vcui_doc_launch_ug_phoneui_destroy_cb success"); +} + +static void __vcui_doc_launch_ug_phoneui_result_cb(struct ui_gadget *ug, bundle *result, void *priv) +{ + CALL_UI_DEBUG("__vcui_doc_launch_ug_phoneui_result_cb nothing"); +} + +void _vcui_doc_launch_phoneui_ug(void *parent_ui_gadget, void *navi, void *parent, void (*on_start_callback) (void *), void (*on_destroy_callback) (void *), void *callback_param, void *ugs_array_data) +{ + CALL_UI_DEBUG("launch_PHONEUI UG start"); + bundle *bd = bundle_create(); + + if (bd == NULL) { + CALL_UI_DEBUG("bundle_craete() return NULL"); + return; + } + + bundle_add(bd, "type", "1"); + + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)ugs_array_data; + if (pugs_array->last_ug_type == VCUI_UG_TYPE_ADD_CALL) { + CALL_UI_DEBUG("launch exit because of same ug execution"); + bundle_free(bd); + return; + } + struct ug_cbs cbs = { 0, }; + cbs.layout_cb = __vcui_doc_launch_ug_phoneui_layout_cb; + cbs.destroy_cb = __vcui_doc_launch_ug_phoneui_destroy_cb; + cbs.result_cb = __vcui_doc_launch_ug_phoneui_result_cb; + + struct vcui_ug_priv_data *temp_priv_data = malloc(sizeof(struct vcui_ug_priv_data)); + if (temp_priv_data == NULL) { + CALL_UI_DEBUG("malloc error.\n"); + bundle_free(bd); + return; + } + temp_priv_data->on_start_callback = on_start_callback; + temp_priv_data->on_destroy_callback = on_destroy_callback; + temp_priv_data->destroy_callback_param = callback_param; + temp_priv_data->need_navi = navi; + temp_priv_data->need_parent = parent; + temp_priv_data->need_ug_lists = ugs_array_data; + local_priv_data = cbs.priv = temp_priv_data; + + struct ui_gadget *ug = ug_create(parent_ui_gadget, PKGNAME_DIALER_UG, UG_MODE_FULLVIEW, bd, &cbs); + temp_priv_data->need_ug = ug; + if (ug == NULL) { + free(temp_priv_data); + local_priv_data = NULL; + CALL_UI_DEBUG("_vcui_doc_launch_contact_list_ug fail"); + } else { + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)ugs_array_data; + pugs_array->ug_count = pugs_array->ug_count + 1; + pugs_array->last_ug_type = VCUI_UG_TYPE_ADD_CALL; + pugs_array->ug_lists = eina_list_append(pugs_array->ug_lists, (void *)ug); + } + bundle_free(bd); + CALL_UI_DEBUG("_vcui_doc_launch_contact_list_ug end"); +} + +static void __vcui_doc_launch_render_flush_post_cb(void *data, Evas *e, void *event_info) +{ + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + if (!ad) + return; + + edje_object_signal_emit(_EDJ(ad->ly), "elm,state,show", ""); + evas_event_callback_del(e, EVAS_CALLBACK_RENDER_FLUSH_POST, __vcui_doc_launch_render_flush_post_cb); +} + +void _vcui_doc_launch_msg_composer(void *data, char *number) +{ + CALL_UI_DEBUG(".."); + + bundle *kb; + kb = bundle_create(); + + bundle_add(kb, "type", "compose"); + bundle_add(kb, "TO", number); + aul_launch_app(MSG_PKG, kb); + bundle_free(kb); +} + +void _vcui_doc_launch_destroy_ug_all(void *ugs_array_data) +{ + CALL_UI_DEBUG(".."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + Evas_Object *base; + + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)ugs_array_data; + if (pugs_array != NULL) { + pugs_array->ug_lists = eina_list_free(pugs_array->ug_lists); + pugs_array->ug_count = 0; + pugs_array->last_ug_type = VCUI_UG_TYPE_NOE; + +#ifdef _LOCAL_UG_EFFECT_ + if (local_priv_data->need_ug != NULL) { + CALL_UI_DEBUG("__vcui_doc_launch_ug_common_hide_effect_finished start"); + base = local_priv_data->need_layout; + + if (base != NULL) { + evas_object_hide(base); + elm_objectt_part_content_unset(base, "elm.swallow.content"); + evas_object_del(base); + } + if (local_priv_data->on_destroy_callback != NULL) + local_priv_data->on_destroy_callback(local_priv_data->destroy_callback_param); + + ug_destroy_all(); + + if (ad->contact_ug != NULL) { + ad->contact_ug = NULL; + _vcui_view_common_call_terminate_or_view_change(); + } + + free(local_priv_data); + local_priv_data = NULL; + + CALL_UI_DEBUG("__vcui_doc_launch_ug_common_hide_effect_finished end"); + } +#else + ug_destroy_all(); + + if (ad->contact_ug != NULL) { + ad->contact_ug = NULL; + _vcui_view_common_call_terminate_or_view_change(); + } + + if (local_priv_data != NULL) { + free(local_priv_data); + local_priv_data = NULL; + } +#endif + } +} + +static void __vcui_doc_launch_ug_contact_layout_cb(struct ui_gadget *ug, enum ug_mode mode, void *priv) +{ + __vcui_doc_launch_ug_common_layout_cb(ug, mode, priv); + CALL_UI_DEBUG("__vcui_doc_launch_ug_contact_layout_cb success"); +} + +static void __vcui_doc_launch_ug_contact_result_cb(struct ui_gadget *ug, bundle *result, void *priv) +{ + CALL_UI_DEBUG("__vcui_doc_launch_ug_phoneui_result_cb nothing"); +} + +static void __vcui_doc_launch_ug_contact_destroy_cb(struct ui_gadget *ug, void *priv) +{ + CALL_UI_DEBUG("__vcui_doc_launch_ug_contact_destroy_cb.."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + __vcui_doc_launch_ug_common_destroy_cb(ug, priv); + ad->contact_ug = NULL; + _vcui_view_common_call_terminate_or_view_change(); +} + +void _vcui_doc_launch_add_to_contacts_ug(void *parent_ui_gadget, void *navi, void *parent, void (*on_start_callback) (void *), void (*on_destroy_callback) (void *), void *callback_param, void *ugs_array_data, void *data) +{ + CALL_UI_DEBUG("launch_ADD_TO_CONTACTS UG start"); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + bundle *bd = bundle_create(); + char buf[4] = {0,}; + + if (bd == NULL) { + CALL_UI_DEBUG("bundle_craete() return NULL"); + return; + } + + snprintf(buf, sizeof(buf), "%d", CT_UG_REQUEST_ADD_WITH_NUM); + bundle_add(bd, CT_UG_BUNDLE_TYPE, buf); /*CT_UG_REQUEST_ADD_WITH_NUM*/ + CALL_UI_DEBUG("number %s", (char*) data); + bundle_add(bd, CT_UG_BUNDLE_NUM, (char*) data); + + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)ugs_array_data; + if (pugs_array->last_ug_type == VCUI_UG_TYPE_ADD_TO_CONTACTS) { + CALL_UI_DEBUG("launch exit because of same ug execution"); + bundle_free(bd); + return; + } + struct ug_cbs cbs = { 0, }; + cbs.layout_cb = __vcui_doc_launch_ug_contact_layout_cb; + cbs.destroy_cb = __vcui_doc_launch_ug_contact_destroy_cb; + cbs.result_cb = __vcui_doc_launch_ug_contact_result_cb; + + struct vcui_ug_priv_data *temp_priv_data = malloc(sizeof(struct vcui_ug_priv_data)); + if (temp_priv_data == NULL) { + CALL_UI_DEBUG("malloc error.\n"); + bundle_free(bd); + return; + } + temp_priv_data->on_start_callback = on_start_callback; + temp_priv_data->on_destroy_callback = on_destroy_callback; + temp_priv_data->destroy_callback_param = callback_param; + temp_priv_data->need_navi = navi; + temp_priv_data->need_parent = parent; + temp_priv_data->need_ug_lists = ugs_array_data; + local_priv_data = cbs.priv = temp_priv_data; + + struct ui_gadget *ug = ug_create(parent_ui_gadget, ADD_TO_CONTACTS_UG, UG_MODE_FULLVIEW, bd, &cbs); + temp_priv_data->need_ug = ug; + if (ug == NULL) { + free(temp_priv_data); + local_priv_data = NULL; + CALL_UI_DEBUG("_vcui_doc_launch_add_to_contacts_ug fail"); + } else { + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)ugs_array_data; + pugs_array->ug_count = pugs_array->ug_count + 1; + pugs_array->last_ug_type = VCUI_UG_TYPE_ADD_TO_CONTACTS; + pugs_array->ug_lists = eina_list_append(pugs_array->ug_lists, (void *)ug); + ad->contact_ug = ug; + } + bundle_free(bd); + CALL_UI_DEBUG("_vcui_doc_launch_add_to_contacts_ug end"); +} diff --git a/ui/vcui-doc-launch.h b/ui/vcui-doc-launch.h new file mode 100755 index 0000000..5ccaa70 --- /dev/null +++ b/ui/vcui-doc-launch.h @@ -0,0 +1,58 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "ui-gadget.h" + +#ifndef _VCUI_DOC_LAUNCH_ +#define _VCUI_DOC_LAUNCH_ + +#define PKGNAME_CONTACT_UG "contacts-list-efl" +#define PKGNAME_DIALER_UG "phoneui-efl" + +typedef enum { + VCUI_UG_TYPE_NOE = 0, + VCUI_UG_TYPE_CONTACT_LIST, + VCUI_UG_TYPE_ADD_CALL, + VCUI_UG_TYPE_ADD_TO_CONTACTS, + VCUI_UG_TYPE_MAX +} vcui_ug_type; + +struct vcui_ugs_array { + int ug_count; + int last_ug_type; + Eina_List *ug_lists; +}; + +struct vcui_ug_priv_data { + void (*on_start_callback) (void *); + void (*on_destroy_callback) (void *); + void *destroy_callback_param; + void *need_navi; + void *need_parent; + void *need_layout; + void *need_ug; + void *need_ug_lists; +}; + +void _vcui_doc_launch_contact_list_ug(void *parent_ui_gadget, void *navi, void *parent, void (*on_start_callback) (void *), void (*on_destroy_callback) (void *), void *callback_param, void *ugs_array_data); +void _vcui_doc_launch_phoneui_ug(void *parent_ui_gadget, void *navi, void *parent, void (*on_start_callback) (void *), void (*on_destroy_callback) (void *), void *callback_param, void *ugs_array_data); +void _vcui_doc_launch_add_to_contacts_ug(void *parent_ui_gadget, void *navi, void *parent, void (*on_start_callback) (void *), void (*on_destroy_callback) (void *), void *callback_param, void *ugs_array_data, void *data); + +void _vcui_doc_launch_msg_composer(void *data, char *number); +void _vcui_doc_launch_destroy_ug_all(void *ugs_array_data); + +#endif diff --git a/ui/vcui-document.c b/ui/vcui-document.c new file mode 100755 index 0000000..b518a52 --- /dev/null +++ b/ui/vcui-document.c @@ -0,0 +1,501 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-document.h" + +static call_data_t *recent_mo; +static call_data_t *recent_mt; +static call_data_t *recent_mt_mo; +static Eina_List *caller_list; + +void _vcui_doc_recent_init() +{ + recent_mo = NULL; + recent_mt = NULL; + recent_mt_mo = NULL; +} + +call_data_t *_vcui_doc_get_recent_mo() +{ + return recent_mo; +} + +call_data_t *_vcui_doc_get_recent_mt() +{ + return recent_mt; +} + +call_data_t *_vcui_doc_get_all_recent() +{ + CALL_UI_DEBUG(".."); + if (recent_mt_mo == NULL) { + CALL_UI_DEBUG("recent is NULL"); + if (recent_mo != NULL) { + recent_mt_mo = recent_mo; + CALL_UI_DEBUG("recent is mo"); + } else if (recent_mt != NULL) { + recent_mt_mo = recent_mt; + CALL_UI_DEBUG("recent is mt"); + } + } + return recent_mt_mo; +} + +void _vcui_doc_set_all_recent(call_data_t *in) +{ + CALL_UI_DEBUG(".."); + if (in == NULL) { + CALL_UI_DEBUG("set recent_mt_mo to null"); + } + recent_mt_mo = in; +} + +void _vcui_doc_set_mo_recent(call_data_t *in) +{ + CALL_UI_DEBUG(".."); + if (in == NULL) { + CALL_UI_DEBUG("set recent_mo to null"); + } + if (recent_mo != NULL && recent_mo->call_handle == NO_HANDLE) { + CALL_UI_DEBUG("Set_recent 1"); + free(recent_mo); + recent_mo = NULL; + } + _vcui_doc_set_all_recent(in); + recent_mo = in; +} + +void _vcui_doc_set_mt_recent(call_data_t *in) +{ + CALL_UI_DEBUG(".."); + if (in == NULL) { + CALL_UI_DEBUG("set recent_mt to null"); + } + _vcui_doc_set_all_recent(in); + recent_mt = in; +} + +void _vcui_doc_caller_list_init() +{ + caller_list = NULL; +} + +int _vcui_doc_is_call_data(call_data_t *in) +{ + if (in == NULL) + return EINA_FALSE; + Eina_List *l; + call_data_t *cd; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd == in) { + return EINA_TRUE; + } + } + + return EINA_FALSE; +} + +void _vcui_doc_add_call_data(call_data_t *in) +{ + if (in == NULL) + return; + Eina_List *l; + call_data_t *cd; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd == in) { + return; + } + } + + caller_list = eina_list_append(caller_list, (void *)in); +} + +void _vcui_doc_update_call_data(call_data_t *in) +{ + if (in == NULL) + return; + Eina_List *l; + call_data_t *cd; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd == in) { + *cd = *in; + return; + } + } +} + +void _vcui_doc_remove_all_data() +{ + Eina_List *l; + call_data_t *cd; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + free(cd); + cd = NULL; + } + } + eina_list_free(caller_list); + caller_list = NULL; +} + +call_data_t *_vcui_doc_remove_call_data_only_list(call_data_t *in) +{ + if (in == NULL) { + CALL_UI_DEBUG("Call data is Null"); + return NULL; + } + Eina_List *l; + call_data_t *cd; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd == in) { + caller_list = eina_list_remove(caller_list, in); + return in; + } + } + return NULL; +} + +void _vcui_doc_remove_call_data(call_data_t *in) +{ + if (in == NULL) { + CALL_UI_DEBUG("Call data is Null"); + return; + } + Eina_List *l; + call_data_t *cd; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd == in) { + if (in == _vcui_doc_get_recent_mo()) + _vcui_doc_set_mo_recent(NULL); + if (in == _vcui_doc_get_recent_mt()) + _vcui_doc_set_mt_recent(NULL); + + caller_list = eina_list_remove(caller_list, in); + free(in); + in = NULL; + CALL_UI_DEBUG("Call data removed"); + break; + } + + } + + if (_vcui_doc_get_count() == 0) { + eina_list_free(caller_list); + caller_list = NULL; + } + +} + +call_data_t *_vcui_doc_get_call_handle(int handle) +{ + Eina_List *l; + call_data_t *cd; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->call_handle == handle) { + return cd; + } + } + } + return NULL; +} + +call_data_t *_vcui_doc_get_first_unhold() +{ + Eina_List *l; + call_data_t *cd; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->caller_status == CALL_UNHOLD) { + return cd; + } + } + } + return NULL; +} + +call_data_t *_vcui_doc_get_first_hold() +{ + Eina_List *l; + call_data_t *cd; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->caller_status == CALL_HOLD) { + return cd; + } + } + } + return NULL; +} + +call_data_t *_vcui_doc_get_last_status(int call_status) +{ + + Eina_List *l; + call_data_t *fast_cd = NULL; + call_data_t *cd; + int i = 0; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->caller_status == call_status) { + if (i == 0) { + fast_cd = cd; + i++; + continue; + } else { + if (fast_cd->start_time > cd->start_time) { + fast_cd = cd; + } + } + i++; + } + } + } + return fast_cd; +} + +call_data_t *_vcui_doc_get_last_type_mo() +{ + + Eina_List *l; + call_data_t *last_cd = NULL; + call_data_t *cd; + int i = 0; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->mo_mt_status == CALL_OUTGOING) { + if (i == 0) { + last_cd = cd; + i++; + continue; + } else { + if (last_cd->start_time < cd->start_time) { + last_cd = cd; + } + } + i++; + } + } + } + return last_cd; +} + +call_data_t *_vcui_doc_get_first() +{ + Eina_List *l; + call_data_t *cd; + EINA_LIST_FOREACH(caller_list, l, cd) + if (cd != NULL) { + return cd; + } + return NULL; +} + +void _vcui_doc_set_unhold_all() +{ + Eina_List *l; + call_data_t *cd; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->caller_status == CALL_HOLD) { + cd->caller_status = CALL_UNHOLD; + } + } + } +} + +void _vcui_doc_set_hold_all() +{ + Eina_List *l; + call_data_t *cd; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->caller_status == CALL_UNHOLD) { + cd->caller_status = CALL_HOLD; + } + } + } +} + +void _vcui_doc_set_swap_all() +{ + Eina_List *l; + call_data_t *cd; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->caller_status == CALL_HOLD) { + cd->caller_status = CALL_UNHOLD; + } else if (cd->caller_status == CALL_UNHOLD) { + cd->caller_status = CALL_HOLD; + } + } + } +} + +int _vcui_doc_get_show_callstatus() +{ + if (_vcui_doc_get_count() > 1) { + if (_vcui_doc_get_count_hold() > 1) + return CALL_HOLD; + else + return CALL_UNHOLD; + } else + return CALL_UNHOLD; +} + +int _vcui_doc_get_count() +{ + int i = eina_list_count(caller_list); + return i; +} + +int _vcui_doc_get_count_hold() +{ + int i = 0; + Eina_List *l; + call_data_t *cd; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->caller_status == CALL_HOLD) { + i++; + } + } + } + CALL_UI_DEBUG("(%d)",i); + return i; +} + +int _vcui_doc_get_count_unhold() +{ + int i = 0; + Eina_List *l; + call_data_t *cd; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->caller_status == CALL_UNHOLD) { + i++; + } + } + } + CALL_UI_DEBUG("(%d)",i); + return i; +} + +int _vcui_doc_get_count_nostatus() +{ + int i = 0; + Eina_List *l; + call_data_t *cd; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->caller_status == NO_STATUS) { + i++; + } + } + } + return i; +} + +Eina_List *_vcui_doc_get_hold_caller() +{ + if (_vcui_doc_get_count() == 0) + return NULL; + Eina_List *hold_list = NULL; + Eina_List *l; + call_data_t *cd; + + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->caller_status == CALL_HOLD) { + hold_list = eina_list_append(hold_list, cd); + } + } + } + return hold_list; +} + +Eina_List *_vcui_doc_get_unhold_caller() +{ + if (_vcui_doc_get_count() == 0) + return NULL; + Eina_List *unhold_list = NULL; + Eina_List *l; + call_data_t *cd; + + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + CALL_UI_DEBUG("_vcui_doc_get_unhold_caller"); + if (cd->caller_status == CALL_UNHOLD) { + CALL_UI_DEBUG("find it"); + unhold_list = eina_list_append(unhold_list, cd); + } + } + } + return unhold_list; +} + +Eina_List *_vcui_doc_get_caller() +{ + if (_vcui_doc_get_count() == 0) + return NULL; + + Eina_List *list = NULL; + Eina_List *l; + call_data_t *cd; + + EINA_LIST_FOREACH(caller_list, l, cd) { + list = eina_list_append(list, cd); + } + return list; +} + +void _vcui_doc_all_print_address() +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + CALL_UI_DEBUG("----------address----------"); + CALL_UI_DEBUG("View Data : DIALING VIEW %p", ad->view_st[VIEW_DIALLING_VIEW]); + CALL_UI_DEBUG("View Data : INCOMING VIEW %p", ad->view_st[VIEW_INCOMING_VIEW]); + CALL_UI_DEBUG("View Data : INCOMING LOCK VIEW %p", ad->view_st[VIEW_INCOMING_LOCK_VIEW]); + CALL_UI_DEBUG("View Data : INCALL ONEVIEW %p", ad->view_st[VIEW_INCALL_ONECALL_VIEW]); + CALL_UI_DEBUG("View Data : INCALL MULTIVIEW SPLIT %p", ad->view_st[VIEW_INCALL_MULTICALL_SPLIT_VIEW]); + CALL_UI_DEBUG("View Data : INCALL MULTIVIEW CONF %p", ad->view_st[VIEW_INCALL_MULTICALL_CONF_VIEW]); + CALL_UI_DEBUG("View Data : INCALL MULTIVIEW LIST %p", ad->view_st[VIEW_INCALL_MULTICALL_LIST_VIEW]); + CALL_UI_DEBUG("View Data : INCALL KEYPAD %p", ad->view_st[VIEW_INCALL_KEYPAD_VIEW]); + CALL_UI_DEBUG(" --------------------------"); + +} + +void _vcui_doc_all_print(char *msg_pos) +{ + CALL_UI_DEBUG(" --------%s------------", msg_pos); + Eina_List *l; + call_data_t *cd; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + CALL_UI_DEBUG(" call_handle %d", cd->call_handle); + CALL_UI_DEBUG(" call_num %s", cd->call_num); + CALL_UI_DEBUG(" call_display %s", cd->call_display); + CALL_UI_DEBUG(" call_file_path %s", cd->call_file_path); + CALL_UI_DEBUG(" call_full_file_path %s", cd->call_full_file_path); + CALL_UI_DEBUG(" caller_status %d", cd->caller_status); + CALL_UI_DEBUG(" call_time %d", (int)(cd->start_time)); + } + } + CALL_UI_DEBUG(" --------------------------"); +} + diff --git a/ui/vcui-document.h b/ui/vcui-document.h new file mode 100755 index 0000000..7d52d7d --- /dev/null +++ b/ui/vcui-document.h @@ -0,0 +1,87 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VOICE_CALL_UI_VIEW_DOCUMENT +#define _VOICE_CALL_UI_VIEW_DOCUMENT + +typedef struct _call_data_t { + unsigned char call_handle; + char call_num[VC_PHONE_NUMBER_LENGTH_MAX]; + char call_display[VC_DISPLAY_NAME_LENGTH_MAX]; + char call_file_path[VC_IMAGE_PATH_LENGTH_MAX]; + char call_full_file_path[VC_IMAGE_PATH_LENGTH_MAX]; + int caller_status; + time_t start_time; + + int mo_mt_status; + + int contact_id; + int contact_phone_type; + gboolean bno_end_show; /* multi list end */ +} call_data_t; + +int _vcui_doc_get_count_hold(); +int _vcui_doc_get_count_unhold(); +int _vcui_doc_get_count_nostatus(); + +int _vcui_doc_is_call_data(call_data_t *in); +void _vcui_doc_add_call_data(call_data_t *in); +void _vcui_doc_update_call_data(call_data_t *in); +void _vcui_doc_remove_call_data(call_data_t *in); +void _vcui_doc_remove_all_data(); +call_data_t *_vcui_doc_remove_call_data_only_list(call_data_t *in); + +call_data_t *_vcui_doc_get_call_handle(int handle); + +int _vcui_doc_get_count(); + +Eina_List *_vcui_doc_get_hold_caller(); +Eina_List *_vcui_doc_get_unhold_caller(); +Eina_List *_vcui_doc_get_caller(); + +call_data_t *_vcui_doc_get_last_status(int call_status); +call_data_t *_vcui_doc_get_last_type_mo(); + +void _vcui_doc_caller_list_init(); +call_data_t *_vcui_doc_get_first(); + +call_data_t *_vcui_doc_get_first_hold(); +call_data_t *_vcui_doc_get_first_unhold(); + +void _vcui_doc_recent_init(); +call_data_t *_vcui_doc_get_recent_mo(); +call_data_t *_vcui_doc_get_recent_mt(); +call_data_t *_vcui_doc_get_all_recent(); +void _vcui_doc_set_all_recent(call_data_t *in); +void _vcui_doc_set_mo_recent(call_data_t *in); +void _vcui_doc_set_mt_recent(call_data_t *in); + +void _vcui_doc_set_unhold_all(); +void _vcui_doc_set_hold_all(); +void _vcui_doc_set_swap_all(); + +int _vcui_doc_get_show_callstatus(); + +void _vcui_doc_all_print(char *); +void _vcui_doc_all_print_address(); + +int get_status_backhide(); +int get_status_delete(); +void add_status(int in); +int get_status_all(); +#endif + diff --git a/ui/vcui-engine-interface.c b/ui/vcui-engine-interface.c new file mode 100755 index 0000000..db246d2 --- /dev/null +++ b/ui/vcui-engine-interface.c @@ -0,0 +1,1113 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-engine-interface.h" +#include "vcui-view-dialing.h" + +/* For Debug Information, Call Event name string constant */ +static char *gszcall_callback_msg[VC_ENGINE_MSG_MAX_TO_UI] = { + "VC_ENGINE_MSG_INCOM_TO_UI", + "VC_ENGINE_MSG_OUTGOING_TO_UI", + "VC_ENGINE_MSG_OUTGOING_ORIG_TO_UI", + "VC_ENGINE_MSG_OUTGOING_ORIG_TO_UI_TEST", + "VC_ENGINE_MSG_OUTGOING_ALERT_TO_UI", + "VC_ENGINE_MSG_CONNECTED_TO_UI", + "VC_ENGINE_MSG_NORMAL_END_TO_UI", + "VC_ENGINE_MSG_INCOM_END_TO_UI", + "VC_ENGINE_MSG_REJECTED_END_TO_UI", + "VC_ENGINE_MSG_OUTGOING_END_TO_UI", + "VC_ENGINE_MSG_OUTGOING_END_SIGNAL_PLAY_TO_UI", + "VC_ENGINE_MSG_OUTGOING_ABORTED_TO_UI", + "VC_ENGINE_MSG_DTMF_ACK_TO_UI", + + "VC_ENGINE_MSG_SS_HELD_TO_UI", + "VC_ENGINE_MSG_SS_RETREIVED_TO_UI", + "VC_ENGINE_MSG_SS_SWAP_TO_UI", + "VC_ENGINE_MSG_SS_SETUP_CONF_TO_UI", + "VC_ENGINE_MSG_SS_SPLIT_CONF_TO_UI", + "VC_ENGINE_MSG_SS_TRANSFERRED_TO_UI", + "VC_ENGINE_MSG_SS_CONNECT_LINE_IND_TO_UI", + + "VC_ENGINE_MSG_IND_FORWARD_TO_UI", + "VC_ENGINE_MSG_IND_ACTIVATE_TO_UI", + "VC_ENGINE_MSG_IND_HOLD_TO_UI", + "VC_ENGINE_MSG_IND_TRANSFER_TO_UI", + "VC_ENGINE_MSG_IND_SETUPCONFERENCE_TO_UI", + "VC_ENGINE_MSG_IND_BARRING_TO_UI", + "VC_ENGINE_MSG_IND_WAITING_TO_UI", + "VC_ENGINE_MSG_IND_CUGINFO_TO_UI", + "VC_ENGINE_MSG_IND_SSNOTIFY_TO_UI", + "VC_ENGINE_MSG_IND_CALLINGNAMEINFO_TO_UI", + "VC_ENGINE_MSG_IND_REDIRECT_CNF_TO_UI", + "VC_ENGINE_MSG_IND_ACTIVATECCBS_CNF_TO_UI", + "VC_ENGINE_MSG_IND_ACTIVATECCBS_USERINFO_TO_UI", + "VC_ENGINE_MSG_IND_AOC_TO_UI", + + "VC_ENGINE_MSG_ERROR_OCCURED_TO_UI", + + "VC_ENGINE_MSG_ACTION_INCOM_FORCE_TO_UI", + "VC_ENGINE_MSG_ACTION_SAT_REQUEST_TO_UI", + "VC_ENGINE_MSG_ACTION_SAT_RESPONSE_TO_UI", + "VC_ENGINE_MSG_ACTION_CALL_END_HELD_RETREIVED_TO_UI", + "VC_ENGINE_MSG_ACTION_NO_ACTIVE_TASK_TO_UI", + + "VC_ENGINE_MSG_GET_VOLUME_RESP_TO_UI", + "VC_ENGINE_MSG_SET_VOLUME_FROM_BT_TO_UI", + "VC_ENGINE_MSG_HEADSET_STATUS_TO_UI", + "VC_ENGINE_MSG_EARJACK_STATUS_TO_UI", + + "VC_ENGINE_MSG_ACCEPT_CHOICE_BOX_TO_UI", + "VC_ENGINE_MSG_MESSAGE_BOX_TO_UI", + + "VC_ENGINE_MSG_REDIAL_TO_UI", + "VC_ENGINE_MSG_STOPPED_RECORDING_TO_UI", + "VC_ENGINE_MSG_CREATE_NEWVOICEFILE_TO_UI", +}; + +static char *gszcall_error_msg[IDS_CALL_MAX] = { + "IDS_CALL_POP_CALL_IS_DIVERTED", + "IDS_CALL_POP_CALLFAILED", + "IDS_CALL_POP_CALLING_EMERG_ONLY", + "IDS_CALL_POP_CALLNOTCALLOWED", + "IDS_CALL_POP_CAUSE_WRONG_NUMBER", + "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL", + "IDS_CALL_POP_DTMFSENDING_FAIL", + "IDS_CALL_POP_FDNCALLONLY", + "IDS_CALL_POP_HOLD_FAILED", + "IDS_CALL_POP_HOLD_NOT_SUPPORTED", + "IDS_CALL_POP_INCOMPLETE", + "IDS_CALL_POP_JOIN_FAILED", + "IDS_CALL_POP_JOIN_NOT_SUPPORTED", + "IDS_CALL_POP_OPERATION_REFUSED", + "IDS_CALL_POP_PHONE_NOT_INITIALISED", + "IDS_CALL_POP_REJECTED", + "IDS_CALL_POP_SENDING", + "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE", + "IDS_CALL_POP_SPLIT_FAILED", + "IDS_CALL_POP_SPLIT_NOT_SUPPORTED", + "IDS_CALL_POP_SWAP_FAILED", + "IDS_CALL_POP_SWAP_NOT_SUPPORTED", + "IDS_CALL_POP_TRANSFER_FAILED", + "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED", + "IDS_CALL_POP_UNABLE_TO_RETRIEVE", + "IDS_CALL_POP_UNAVAILABLE", + "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED", + "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL", + "IDS_CALL_POP_WAITING_ACTIVE", + "IDS_CALL_BODY_CALLENDED", + "Invalid DTMF", + "Sent" +}; + +void _vcui_engine_init(vcui_app_call_data_t *ad) +{ + CALL_UI_DEBUG(".."); + vcall_engine_init((vcall_engine_app_cb) _vcui_engine_callback, ad); + CALL_UI_DEBUG("End.."); +} + +void _vcui_engine_answer_call(void) +{ + int ret = VCALL_ENGINE_API_SUCCESS; + + CALL_UI_DEBUG(".."); + + ret = vcall_engine_answer_call(); + + CALL_UI_DEBUG("End.."); +} + +void _vcui_engine_answer_call_by_type(int ans_type) +{ + CALL_UI_DEBUG(".."); + + vcall_engine_answer_call_by_type(ans_type); + + CALL_UI_DEBUG("End.."); +} + +void _vcui_engine_cancel_call(void) +{ + CALL_UI_DEBUG(".."); + + vcall_engine_cancel_call(); + + CALL_UI_DEBUG("End.."); +} + +void _vcui_engine_reject_call(void) +{ + CALL_UI_DEBUG(".."); + + vcall_engine_reject_call(); + + CALL_UI_DEBUG("End.."); +} + +void _vcui_engine_set_volume_level(vcui_vol_type_t vol_type, int level) +{ + int vol = 0; + vcall_engine_vol_type_t engine_vol_type = VCALL_ENGINE_VOL_TYPE_RINGTONE; + CALL_UI_DEBUG(".."); + + if (vol_type == VCUI_VOL_RING) { + engine_vol_type = VCALL_ENGINE_VOL_TYPE_RINGTONE; + } else if (vol_type == VCUI_VOL_VOICE) { + engine_vol_type = VCALL_ENGINE_VOL_TYPE_VOICE; + } else if (vol_type == VCUI_VOL_HEADSET) { + engine_vol_type = VCALL_ENGINE_VOL_TYPE_HEADSET; + } + + vol = vcall_engine_set_volume_level(engine_vol_type, level); + CALL_UI_DEBUG("End.."); +} + +int _vcui_engine_get_volume_level(vcui_vol_type_t vol_type) +{ + int vol = 0; + vcall_engine_vol_type_t engine_vol_type = VCALL_ENGINE_VOL_TYPE_RINGTONE; + CALL_UI_DEBUG("vol_type(%d)", vol_type); + + if (vol_type == VCUI_VOL_RING) { + engine_vol_type = VCALL_ENGINE_VOL_TYPE_RINGTONE; + } else if (vol_type == VCUI_VOL_VOICE) { + engine_vol_type = VCALL_ENGINE_VOL_TYPE_VOICE; + } else if (vol_type == VCUI_VOL_HEADSET) { + engine_vol_type = VCALL_ENGINE_VOL_TYPE_HEADSET; + } + + vol = vcall_engine_get_volume_level(engine_vol_type); + CALL_UI_DEBUG("End.."); + + return vol; +} + +void _vcui_engine_change_sound_path(vcui_audio_type_t sound_path) +{ + int ret = 0; + vcall_engine_audio_type_t rqst_snd_path = VCALL_ENGINE_AUDIO_NONE; + CALL_UI_DEBUG("sound_path(%d)", sound_path); + + if (sound_path == VCUI_AUDIO_SPEAKER) { + rqst_snd_path = VCALL_ENGINE_AUDIO_SPEAKER; + } else if (sound_path == VCUI_AUDIO_HEADSET) { + rqst_snd_path = VCALL_ENGINE_AUDIO_HEADSET; + } else if (sound_path == VCUI_AUDIO_EARJACK) { + rqst_snd_path = VCALL_ENGINE_AUDIO_EARJACK; + } + + vcall_engine_change_sound_path(rqst_snd_path); + CALL_UI_DEBUG("End.."); +} + +vcui_audio_type_t _vcui_engine_get_sound_path(void) +{ + int ret = 0; + int snd_path = VCALL_ENGINE_AUDIO_NONE; + + ret = vcall_engine_get_sound_path(&snd_path); + + if (snd_path == VCALL_ENGINE_AUDIO_SPEAKER) { + return VCUI_AUDIO_SPEAKER; + } else if (snd_path == VCALL_ENGINE_AUDIO_HEADSET) { + return VCUI_AUDIO_HEADSET; + } else if (snd_path == VCALL_ENGINE_AUDIO_EARJACK) { + return VCUI_AUDIO_EARJACK; + } else if (snd_path == VCALL_ENGINE_AUDIO_RECEIVER) { + return VCUI_AUDIO_RECEIVER; + } else { + return VCALL_ENGINE_AUDIO_NONE; + } +} + +void _vcui_engine_stop_alert(void) +{ + CALL_UI_DEBUG(".."); + + vcall_engine_stop_alert(); + + CALL_UI_DEBUG("End.."); +} + +void _vcui_engine_end_call(void) +{ + CALL_UI_DEBUG(".."); + + vcall_engine_release_call(); + + CALL_UI_DEBUG("End.."); +} + +void _vcui_engine_end_call_by_handle(int handle) +{ + CALL_UI_DEBUG("handle(%d)",handle); + + vcall_engine_release_call_by_handle(handle); + + CALL_UI_DEBUG("End.."); +} + +void _vcui_engine_end_all_call(void) +{ + CALL_UI_DEBUG(".."); + + vcall_engine_release_call_by_type(VCALL_ENGINE_RELEASE_ALL_CALLS); + + CALL_UI_DEBUG("End.."); +} + +void _vcui_engine_end_active_calls(void) +{ + CALL_UI_DEBUG(".."); + + vcall_engine_release_call_by_type(VCALL_ENGINE_RELEASE_ALL_ACTIVE_CALLS); + + CALL_UI_DEBUG("End.."); +} + +void _vcui_engine_end_held_calls(void) +{ + CALL_UI_DEBUG(".."); + + vcall_engine_release_call_by_type(VCALL_ENGINE_RELEASE_ALL_HELD_CALLS); + + CALL_UI_DEBUG("End.."); +} + +void _vcui_engine_hold_unhold_swap_call(void) +{ + CALL_UI_DEBUG(".."); + + vcall_engine_process_hold_call(); + + CALL_UI_DEBUG("End.."); +} + +void _vcui_engine_join_call(void) +{ + CALL_UI_DEBUG(".."); + + vcall_engine_join_call(); + + CALL_UI_DEBUG("End.."); +} + +void _vcui_engine_split_call(int call_handle) +{ + CALL_UI_DEBUG(".."); + + vcall_engine_split_call(call_handle); + + CALL_UI_DEBUG("End.."); +} + +void _vcui_engine_transfer_call(void) +{ + CALL_UI_DEBUG(".."); + + vcall_engine_transfer_call(); + + CALL_UI_DEBUG("End.."); +} + +void _vcui_engine_speaker_on_off(int bLoundSpeaker) +{ + CALL_UI_DEBUG(".."); + + vcall_engine_process_loudspeaker(bLoundSpeaker); + + CALL_UI_DEBUG("End.."); +} + +void _vcui_engine_mute_on_off(int bMute) +{ + CALL_UI_DEBUG(".."); + + vcall_engine_process_voice_mute(bMute); + + CALL_UI_DEBUG("End.."); +} + +void _vcui_engine_interface_process_auto_redial(int bRedial) +{ + CALL_UI_DEBUG(".."); + + vcall_engine_process_auto_redial(bRedial); + + CALL_UI_DEBUG("End.."); +} + +void _vcui_engine_interface_process_mute_alert(void) +{ + CALL_UI_DEBUG(".."); + + vcall_engine_mute_alert(); + + CALL_UI_DEBUG("End.."); +} + +void _vcui_engine_interface_send_dtmf_number(char data) +{ + CALL_UI_DEBUG(".."); + char dtmf_number[2]; + + dtmf_number[0] = data; + dtmf_number[1] = '\0'; + + vcall_engine_send_dtmf_number(dtmf_number); + + CALL_UI_DEBUG("End.."); +} + +void _vcui_engine_interface_process_mo_call(vcui_call_type_t call_type, vcui_call_mo_data_t *data) +{ + CALL_UI_DEBUG("."); + + CALL_UI_KPI("vcall_engine_process_normal_call start"); + vcui_call_mo_data_t *mocall = (vcui_call_mo_data_t *) data; + CALL_UI_DEBUG("number is : [%s] ", mocall->call_number); + + if (call_type == VCUI_CALL_TYPE_MO) + vcall_engine_process_normal_call(mocall->call_number, mocall->ct_index, EINA_FALSE); + else if (call_type == VCUI_CALL_TYPE_DOWNLOAD_CALL) + vcall_engine_process_normal_call(mocall->call_number, mocall->ct_index, EINA_TRUE); + + CALL_UI_KPI("vcall_engine_process_normal_call done"); + +} + +void _vcui_engine_interface_process_mt_call(vcui_call_type_t call_type, vcui_call_mt_data_t *data) +{ + CALL_UI_KPI("vcall_engine_process_incoming_call start"); + vcui_call_mt_data_t *mtcall = (vcui_call_mt_data_t *) data; + vcall_engine_incoming_info_t mtcall_info; + CALL_UI_DEBUG("number is : [%s] ", mtcall->call_num); + + mtcall_info.call_handle = mtcall->call_handle; + mtcall_info.call_type = mtcall->call_type; + mtcall_info.cli_presentation_indicator = mtcall->cli_presentation_indicator; + _vc_core_util_strcpy(mtcall_info.call_num, sizeof(mtcall_info.call_num), mtcall->call_num); + mtcall_info.calling_name_mode = mtcall->calling_name_mode; + _vc_core_util_strcpy(mtcall_info.calling_name, sizeof(mtcall_info.calling_name), mtcall->calling_name); + _vc_core_util_strcpy(mtcall_info.redirected_number, sizeof(mtcall_info.redirected_number), mtcall->redirected_number); + _vc_core_util_strcpy(mtcall_info.redirected_sub_address, sizeof(mtcall_info.redirected_sub_address), mtcall->redirected_sub_address); + mtcall_info.cli_cause = mtcall->cli_cause; + mtcall_info.bfwded = mtcall->bfwded; + mtcall_info.active_line = mtcall->active_line; + + vcall_engine_process_incoming_call(&mtcall_info); + CALL_UI_KPI("vcall_engine_process_incoming_call done"); +} + +void _vcui_engine_interface_process_ecc_call(vcui_call_type_t call_type, vcui_call_ecc_data_t *data) +{ + vcui_call_ecc_data_t *emercall = (vcui_call_ecc_data_t *) data; + + CALL_UI_DEBUG("number is : [%s] ", emercall->call_number); + if (call_type == VCUI_CALL_TYPE_ECC) + vcall_engine_process_emergency_call(emercall->call_number); + else if (call_type == VCUI_CALL_TYPE_ECC_TEST) + vcall_engine_process_emergency_call_test(emercall->call_number); + +} + +void _vcui_engine_interface_process_sat_call(vcui_call_type_t call_type, vcui_call_sat_data_t *data) +{ + vcui_call_sat_data_t *satcall = (vcui_call_sat_data_t *) data; + vcall_engine_sat_setup_call_info_t sat_setup_call_info; + CALL_UI_DEBUG(".."); + + memset(&sat_setup_call_info, 0, sizeof(sat_setup_call_info)); + sat_setup_call_info.command_id = satcall->command_id; + sat_setup_call_info.command_qualifier = satcall->command_qualifier; + sat_setup_call_info.duration = satcall->duration; + memcpy(sat_setup_call_info.disp_text, satcall->disp_text, sizeof(sat_setup_call_info.disp_text)); + memcpy(sat_setup_call_info.call_num, satcall->call_num, VC_PHONE_NUMBER_LENGTH_MAX); + + vcall_engine_process_sat_setup_call(&sat_setup_call_info); +} + +void _vcui_engine_callback(int event, void *pdata, void *puser_data) +{ + vcui_app_call_data_t *ad = (vcui_app_call_data_t *) puser_data; + vc_engine_msg_type *msg = (vc_engine_msg_type *)pdata; + + if ((ad == NULL) || (msg == NULL)) { + CALL_UI_DEBUG("ERROR.NULL pointer"); + return; + } + CALL_UI_DEBUG("@@@ event:[%s], view_top:[%d], count:[%d] @@@ \n", gszcall_callback_msg[event], ad->view_top, _vcui_doc_get_count()); + + switch (event) { + case VC_ENGINE_MSG_INCOM_TO_UI: + { + _voicecall_dvc_control_lcd_state(VC_LCD_ON_LOCK); + + CALL_UI_DEBUG("num:[%s], name:[%s]", msg->incoming.call_num, msg->incoming.call_name); + + call_data_t *call_data = malloc(sizeof(call_data_t)); + if (call_data == NULL) + return; + memset(call_data, 0, sizeof(call_data_t)); + + call_data->call_handle = msg->incoming.call_handle; + call_data->contact_id = msg->incoming.contact_index; + call_data->contact_phone_type = msg->incoming.phone_type; + vcall_engine_util_strcpy(call_data->call_num, sizeof(call_data->call_num), msg->incoming.call_num); + if (msg->incoming.brestricted == EINA_TRUE) { + if (msg->incoming.bpayphone == EINA_TRUE) { + vcall_engine_util_strcpy(call_data->call_display, VC_DISPLAY_NAME_LENGTH_MAX, _("Payphone")); + } else { + vcall_engine_util_strcpy(call_data->call_display, VC_DISPLAY_NAME_LENGTH_MAX, dgettext("sys_string", "IDS_COM_BODY_UNKNOWN")); + } + } else { + vcall_engine_util_strcpy(call_data->call_display, VC_DISPLAY_NAME_LENGTH_MAX, msg->incoming.call_name); + } + + if (strcmp((char *)msg->incoming.call_file_path, "default") == 0) + vcall_engine_util_strcpy(call_data->call_file_path, VC_IMAGE_PATH_LENGTH_MAX, NOIMG_ICON); + else if (strlen((char *)msg->incoming.call_file_path) == 0) + vcall_engine_util_strcpy(call_data->call_file_path, VC_IMAGE_PATH_LENGTH_MAX, NOIMG_ICON); + else + vcall_engine_util_strcpy(call_data->call_file_path, VC_IMAGE_PATH_LENGTH_MAX, msg->incoming.call_file_path); + + if (strcmp((char *)msg->incoming.call_full_file_path, "default") == 0) + vcall_engine_util_strcpy(call_data->call_full_file_path, VC_IMAGE_PATH_LENGTH_MAX, NOIMG_ICON); + else if (strlen((char *)msg->incoming.call_full_file_path) == 0) + vcall_engine_util_strcpy(call_data->call_full_file_path, VC_IMAGE_PATH_LENGTH_MAX, NOIMG_ICON); + else + vcall_engine_util_strcpy(call_data->call_full_file_path, VC_IMAGE_PATH_LENGTH_MAX, msg->incoming.call_full_file_path); + + call_data->caller_status = NO_STATUS; + call_data->mo_mt_status = CALL_INCOMING; + + _vcui_doc_set_mt_recent(call_data); + _vcui_doc_add_call_data(call_data); + + if (_vcui_is_idle_lock() == CALL_LOCK) { + _vcui_view_change(VIEW_INCOMING_LOCK_VIEW, 0, NULL, NULL); + } else { + _vcui_view_change(VIEW_INCOMING_VIEW, 0, NULL, NULL); + } + } + break; + + case VC_ENGINE_MSG_OUTGOING_TO_UI: + { + call_data_t *call_data = malloc(sizeof(call_data_t)); + if (call_data == NULL) + return; + memset(call_data, 0, sizeof(call_data_t)); + + call_data->call_handle = NO_HANDLE; + call_data->contact_id = msg->outgoing.contact_index; + call_data->contact_phone_type = msg->outgoing.phone_type; + vcall_engine_util_strcpy(call_data->call_num, VC_PHONE_NUMBER_LENGTH_MAX, msg->outgoing.call_num); + vcall_engine_util_strcpy(call_data->call_display, VC_DISPLAY_NAME_LENGTH_MAX, msg->outgoing.call_name); + + if (strcmp((char *)msg->outgoing.call_file_path, "default") == 0) + vcall_engine_util_strcpy(call_data->call_file_path, VC_IMAGE_PATH_LENGTH_MAX, NOIMG_ICON); + else if (strlen((char *)msg->outgoing.call_file_path) == 0) + vcall_engine_util_strcpy(call_data->call_file_path, VC_IMAGE_PATH_LENGTH_MAX, NOIMG_ICON); + else + vcall_engine_util_strcpy(call_data->call_file_path, VC_IMAGE_PATH_LENGTH_MAX, msg->outgoing.call_file_path); + + if (strcmp((char *)msg->outgoing.call_full_file_path, "default") == 0) + vcall_engine_util_strcpy(call_data->call_full_file_path, VC_IMAGE_PATH_LENGTH_MAX, NOIMG_ICON); + else if (strlen((char *)msg->outgoing.call_full_file_path) == 0) + vcall_engine_util_strcpy(call_data->call_full_file_path, VC_IMAGE_PATH_LENGTH_MAX, NOIMG_ICON); + else + vcall_engine_util_strcpy(call_data->call_full_file_path, VC_IMAGE_PATH_LENGTH_MAX, msg->outgoing.call_full_file_path); + + call_data->caller_status = NO_STATUS; + call_data->mo_mt_status = CALL_OUTGOING; + call_data->start_time = time(&(call_data->start_time)); + + _vcui_doc_set_mo_recent(call_data); + + } + break; + + case VC_ENGINE_MSG_OUTGOING_ORIG_TO_UI: + { + if (_voicecall_dvc_get_proximity_sensor_state() != VCALL_SENSOR_NEAR) + _voicecall_dvc_control_lcd_state(VC_LCD_ON_LOCK); + + vc_engine_outgoing_orig_type outgoing_orig = msg->outgoing_orig; + + call_data_t *call_data = _vcui_doc_get_recent_mo(); + call_data->call_handle = outgoing_orig.call_handle; + + if (outgoing_orig.bemergency == EINA_TRUE) { + CALL_UI_DEBUG("it is emergency call"); + char *em_name = _("IDS_CALL_POP_EMERGENCY_CALL"); + + memset(call_data->call_display, 0, sizeof(call_data->call_display)); + memset(call_data->call_file_path, 0, sizeof(call_data->call_file_path)); + memset(call_data->call_full_file_path, 0, sizeof(call_data->call_full_file_path)); + + vcall_engine_util_strcpy(call_data->call_display, VC_DISPLAY_NAME_LENGTH_MAX, em_name); + vcall_engine_util_strcpy(call_data->call_file_path, VC_IMAGE_PATH_LENGTH_MAX, NOIMG_ICON); + vcall_engine_util_strcpy(call_data->call_full_file_path, VC_IMAGE_PATH_LENGTH_MAX, NOIMG_ICON); + call_data->contact_phone_type = -1; + } + + _vcui_doc_add_call_data(call_data); + _vcui_view_change(VIEW_DIALLING_VIEW, 0, NULL, NULL); + } + break; + + case VC_ENGINE_MSG_OUTGOING_ORIG_TO_UI_TEST: + { + if (_voicecall_dvc_get_proximity_sensor_state() != VCALL_SENSOR_NEAR) + _voicecall_dvc_control_lcd_state(VC_LCD_ON_LOCK); + + vc_engine_outgoing_orig_type outgoing_orig = msg->outgoing_orig; + + call_data_t *call_data = _vcui_doc_get_recent_mo(); + call_data->call_handle = 1; + + if (outgoing_orig.bemergency == EINA_TRUE) { + CALL_UI_DEBUG("it is emergency call"); + char *em_name = _("IDS_CALL_POP_EMERGENCY_CALL"); + + memset(call_data->call_display, 0, sizeof(call_data->call_display)); + memset(call_data->call_file_path, 0, sizeof(call_data->call_file_path)); + memset(call_data->call_full_file_path, 0, sizeof(call_data->call_full_file_path)); + + vcall_engine_util_strcpy(call_data->call_display, VC_DISPLAY_NAME_LENGTH_MAX, em_name); + vcall_engine_util_strcpy(call_data->call_file_path, VC_IMAGE_PATH_LENGTH_MAX, NOIMG_ICON); + vcall_engine_util_strcpy(call_data->call_full_file_path, VC_IMAGE_PATH_LENGTH_MAX, NOIMG_ICON); + call_data->contact_phone_type = -1; + } + + _vcui_doc_add_call_data(call_data); + _vcui_view_change(VIEW_DIALLING_VIEW, 0, NULL, NULL); + } + break; + + case VC_ENGINE_MSG_OUTGOING_ALERT_TO_UI: + { + call_data_t *call_data = _vcui_doc_get_recent_mo(); + + if (call_data == NULL) { + CALL_UI_DEBUG("Error"); + elm_exit(); + return; + } + + if (_vcui_doc_is_call_data(call_data) == EINA_FALSE) { + CALL_UI_DEBUG("Error. check outgoing_orig msg."); + elm_exit(); + return; + } + + _vcui_view_dialing_draw_txt_connecting(ad->view_st[VIEW_DIALLING_VIEW]); + } + break; + + case VC_ENGINE_MSG_CONNECTED_TO_UI: + { + _voicecall_dvc_control_lcd_state(VC_LCD_ON_UNLOCK); + + vc_engine_connected_type connected = msg->connected; + call_data_t *call_data = _vcui_doc_get_call_handle(connected.call_handle); + + if (call_data == NULL) { + CALL_UI_DEBUG("Error"); + elm_exit(); + return; + } + + call_data->caller_status = CALL_UNHOLD; + call_data->call_handle = connected.call_handle; + call_data->start_time = time(&(call_data->start_time)); + + /* When new call connected, if it's multiparty call, always show split1 first. */ + ad->bswapped = EINA_FALSE; + + _vcui_view_auto_change(); + } + break; + + case VC_ENGINE_MSG_NORMAL_END_TO_UI: + { + vc_engine_normal_end_type normal_end = msg->normal_end; + + CALL_UI_DEBUG("end_cause_type:[%d]", normal_end.end_cause_type); + + call_data_t *call_data = _vcui_doc_get_call_handle(normal_end.call_handle); + if (call_data == NULL) { + CALL_UI_DEBUG("Error"); + elm_exit(); + return; + } + if (call_data->mo_mt_status == CALL_INCOMING) + _vcui_add_calllog(CTS_PLOG_TYPE_VOICE_INCOMMING, call_data, EINA_FALSE); + else if (call_data->mo_mt_status == CALL_OUTGOING) + _vcui_add_calllog(CTS_PLOG_TYPE_VOICE_OUTGOING, call_data, EINA_FALSE); + + time_t start_time; + memcpy(&start_time, &(call_data->start_time), sizeof(call_data->start_time)); + + if (call_data->bno_end_show == EINA_TRUE) { + _vcui_doc_remove_call_data(call_data); + _vcui_view_common_call_terminate_or_view_change(); + } else { + vcui_app_call_data_t *ad = _vcui_get_app_data(); + if (_vcui_doc_get_count() == 1 && ad->view_top == VIEW_INCALL_ONECALL_VIEW) { + ad->call_end_type = CALL_END_TYPE_SINGLE_CALL; + } + CALL_UI_DEBUG("ad->call_end_type[%d]", ad->call_end_type); + if (ad->call_end_type == CALL_END_TYPE_SINGLE_CALL || ad->call_end_type == CALL_END_TYPE_CONF_CALL) { + CALL_UI_DEBUG("Show end screen - %d", ad->call_end_type); + _vcui_view_change(VIEW_ENDCALL_VIEW, -1, call_data, NULL); + ad->call_end_type = CALL_END_TYPE_NONE; + CALL_UI_DEBUG("Blink show: end call time"); + _vcui_view_common_call_end_show(start_time, normal_end.end_cause_type); + _vcui_doc_remove_call_data(call_data); + } + else { + _vcui_doc_remove_call_data(call_data); + _vcui_view_common_call_terminate_or_view_change(); + } + } + } + break; + + case VC_ENGINE_MSG_INCOM_END_TO_UI: + { + _voicecall_dvc_control_lcd_state(VC_LCD_ON_UNLOCK); + + vc_engine_common_with_handle_type incom_end = msg->incom_end; + + call_data_t *call_data = _vcui_doc_get_call_handle(incom_end.call_handle); + if (call_data == NULL) { + CALL_UI_DEBUG("Error"); + elm_exit(); + return; + } + + _vcui_add_calllog(CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN, call_data, EINA_FALSE); + _vcui_doc_remove_call_data(call_data); + + _vcui_view_common_call_terminate_or_view_change(); + + } + break; + + case VC_ENGINE_MSG_REJECTED_END_TO_UI: + { + _voicecall_dvc_control_lcd_state(VC_LCD_ON_UNLOCK); + + vc_engine_common_with_handle_type rejected_end = msg->rejected_end; + + call_data_t *call_data = _vcui_doc_get_call_handle(rejected_end.call_handle); + + if (call_data == NULL) { + CALL_UI_DEBUG("Error"); + elm_exit(); + + return; + } + + _vcui_add_calllog(CTS_PLOG_TYPE_VOICE_REJECT, call_data, EINA_FALSE); + _vcui_doc_remove_call_data(call_data); + _vcui_view_common_call_terminate_or_view_change(); + } + break; + + case VC_ENGINE_MSG_OUTGOING_END_TO_UI: + { + _voicecall_dvc_control_lcd_state(VC_LCD_ON_UNLOCK); + + vc_engine_outgoing_end_type outgoing_end = msg->outgoing_end; + call_data_t *call_data = _vcui_doc_get_call_handle(outgoing_end.call_handle); + + if (call_data == NULL) { + CALL_UI_DEBUG("It is the case which call orig is not received."); + char data[VC_DATA_LENGTH_MAX] = { 0, }; + _vcui_view_popup_load(_vcui_get_endcause_string(outgoing_end.end_cause_type, data), POPUP_TIMEOUT_LONG, EINA_TRUE); + } else { + _vcui_add_calllog(CTS_PLOG_TYPE_VOICE_OUTGOING, call_data, EINA_TRUE); + if (outgoing_end.bauto_redial == EINA_TRUE) { + CALL_UI_DEBUG("bauto_redial is EINA_TRUE"); + _vcui_doc_remove_call_data_only_list(call_data); + } else { + CALL_UI_DEBUG("show the call end screen"); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + if (_vcui_doc_get_count() == 1 && ad->view_top == VIEW_DIALLING_VIEW) { + ad->call_end_type = CALL_END_TYPE_SINGLE_CALL; + _vcui_view_change(VIEW_ENDCALL_VIEW, -1, call_data, NULL); + } + _vcui_doc_remove_call_data(call_data); + } + _vcui_view_common_call_end_show_dialing(outgoing_end.end_cause_type, outgoing_end.bauto_redial); + } + + } + break; + + case VC_ENGINE_MSG_OUTGOING_END_SIGNAL_PLAY_TO_UI: + { + vc_engine_outgoing_end_signal_play_type outgoing_end_signal_play = msg->outgoing_end_signal_play; + call_data_t *call_data = _vcui_doc_get_call_handle(outgoing_end_signal_play.call_handle); + + if (call_data != NULL) { + _vcui_view_dialing_draw_txt_ended(ad->view_st[ad->view_top], outgoing_end_signal_play.end_cause_type); + } else { + CALL_UI_DEBUG("Check it whether call data exists. handle:[%d]", outgoing_end_signal_play.call_handle); + } + } + break; + + case VC_ENGINE_MSG_OUTGOING_ABORTED_TO_UI: + { + _voicecall_dvc_control_lcd_state(VC_LCD_ON_UNLOCK); + + vc_engine_common_with_handle_type outgoing_aborted = msg->outgoing_aborted; + call_data_t *call_data = _vcui_doc_get_call_handle(outgoing_aborted.call_handle); + + if (call_data == NULL) + call_data = _vcui_doc_get_recent_mo(); + + if (call_data == NULL) { + CALL_UI_DEBUG("Error"); + elm_exit(); + return; + } + + _vcui_add_calllog(CTS_PLOG_TYPE_VOICE_OUTGOING, call_data, EINA_TRUE); + + _vcui_doc_remove_call_data(call_data); + + _vcui_view_common_call_terminate_or_view_change(); + + } + break; + + case VC_ENGINE_MSG_DTMF_ACK_TO_UI: + { +#ifdef PDIAL_SEND_DTMF + + vc_engine_dtmf_ack_type dtmf_ack = msg->dtmf_progress; + + if (EINA_FALSE == dtmf_ack.bstatus) { + _vcui_view_popup_unload_progress(ad); + if ((dtmf_ack.string_id != -1) && (dtmf_ack.string_id != IDS_CALL_POP_DTMF_SENT)) { + CALL_UI_DEBUG("load popup window... Start"); + _vcui_view_popup_load(_(gszcall_error_msg[dtmf_ack.string_id]), POPUP_TIMEOUT_LONG, EINA_FALSE); + } + } else { + CALL_UI_DEBUG("display_string:[%s], string_id:[%d]", dtmf_ack.display_string, dtmf_ack.string_id); + _vcui_view_popup_load_sending_dtmf(_(gszcall_error_msg[dtmf_ack.string_id]), dtmf_ack.display_string); + } +#endif + } + break; + + case VC_ENGINE_MSG_SS_HELD_TO_UI: + { + _vcui_doc_set_hold_all(); + _vcui_view_update(); + } + break; + + case VC_ENGINE_MSG_SS_RETREIVED_TO_UI: + { + _vcui_doc_set_unhold_all(); + _vcui_view_update(); + } + break; + + case VC_ENGINE_MSG_SS_SWAP_TO_UI: + { + _vcui_view_popup_unload(ad->popup_eo); + + if (ad->bholdisleft == EINA_TRUE) { + ad->bswapped = EINA_FALSE; + } else { + ad->bswapped = EINA_TRUE; + } + + _vcui_doc_set_swap_all(); + _vcui_view_auto_change(); + } + break; + + case VC_ENGINE_MSG_SS_SETUP_CONF_TO_UI: + { + _vcui_view_popup_unload(ad->popup_eo); + + _vcui_doc_set_unhold_all(); + _vcui_view_auto_change(); + } + break; + + case VC_ENGINE_MSG_SS_SPLIT_CONF_TO_UI: + { + vc_engine_common_with_handle_type ss_split_conf = msg->ss_split_conf; + + CALL_UI_DEBUG("[UI]The handle is %d ", ss_split_conf.call_handle); + + call_data_t *call_data = _vcui_doc_get_call_handle(ss_split_conf.call_handle); + if (call_data == NULL) { + CALL_UI_DEBUG("Error"); + elm_exit(); + return; + } else { + _vcui_doc_set_hold_all(); + call_data->caller_status = CALL_UNHOLD; + + _vcui_view_auto_change(); + } + } + break; + + case VC_ENGINE_MSG_SS_TRANSFERRED_TO_UI: + break; + + case VC_ENGINE_MSG_SS_CONNECT_LINE_IND_TO_UI: + break; + + case VC_ENGINE_MSG_IND_FORWARD_TO_UI: + break; + + case VC_ENGINE_MSG_IND_ACTIVATE_TO_UI: + { + _vcui_view_popup_load(_("IDS_CALL_POP_UNHELD"), POPUP_TIMEOUT_SHORT, EINA_FALSE); + } + break; + + case VC_ENGINE_MSG_IND_HOLD_TO_UI: + { + _vcui_view_popup_load(_("IDS_CALL_POP_HELD"), POPUP_TIMEOUT_SHORT, EINA_FALSE); + } + break; + + case VC_ENGINE_MSG_IND_TRANSFER_TO_UI: + break; + + case VC_ENGINE_MSG_IND_SETUPCONFERENCE_TO_UI: + break; + + case VC_ENGINE_MSG_IND_BARRING_TO_UI: + break; + + case VC_ENGINE_MSG_IND_WAITING_TO_UI: + { + _vcui_view_popup_load(_("IDS_CALL_POP_WAITING_ACTIVE"), POPUP_TIMEOUT_SHORT, EINA_FALSE); + } + break; + + case VC_ENGINE_MSG_IND_CUGINFO_TO_UI: + break; + + case VC_ENGINE_MSG_IND_SSNOTIFY_TO_UI: + break; + + case VC_ENGINE_MSG_IND_CALLINGNAMEINFO_TO_UI: + break; + + case VC_ENGINE_MSG_IND_REDIRECT_CNF_TO_UI: + break; + + case VC_ENGINE_MSG_IND_ACTIVATECCBS_CNF_TO_UI: + break; + + case VC_ENGINE_MSG_IND_ACTIVATECCBS_USERINFO_TO_UI: + break; + + case VC_ENGINE_MSG_GET_VOLUME_RESP_TO_UI: + { + vc_engine_vol_resp_type vol_resp = msg->vol_resp; + _vcui_response_volume(vol_resp.vol_alert_type, vol_resp.vol_level); + } + break; + + case VC_ENGINE_MSG_SET_VOLUME_FROM_BT_TO_UI: + { + vc_engine_vol_set_from_bt_type vol_set_from_bt = msg->vol_set_from_bt; + ad->bt_vol_val = vol_set_from_bt.vol_level; + _vcui_view_popup_vol_bt(ad->bt_vol_val); + } + break; + + case VC_ENGINE_MSG_ACTION_NO_ACTIVE_TASK_TO_UI: + { + + } + break; + + case VC_ENGINE_MSG_ACTION_CALL_END_HELD_RETREIVED_TO_UI: + { + + } + break; + + case VC_ENGINE_MSG_ACTION_SAT_RESPONSE_TO_UI: + { + + } + break; + + case VC_ENGINE_MSG_ACTION_SAT_REQUEST_TO_UI: + { + + } + break; + + case VC_ENGINE_MSG_ERROR_OCCURED_TO_UI: + break; + + case VC_ENGINE_MSG_IND_AOC_TO_UI: + break; + + case VC_ENGINE_MSG_ACCEPT_CHOICE_BOX_TO_UI: + { + CALL_UI_DEBUG("not supported"); + } + break; + + case VC_ENGINE_MSG_HEADSET_STATUS_TO_UI: + { + vc_engine_headset_status_type headset_status = msg->headset_status; + ad->headset_status = headset_status.bstatus; + if (ad->headset_status == EINA_TRUE) { + ad->speaker_status = EINA_FALSE; + } + + CALL_UI_DEBUG("Headset Status = %d", ad->headset_status); + CALL_UI_DEBUG("ad->view_top:[%d]", ad->view_top); + + if ((ad->view_top == VIEW_INCALL_ONECALL_VIEW) || (ad->view_top == VIEW_INCALL_MULTICALL_SPLIT_VIEW) + || (ad->view_top == VIEW_INCALL_MULTICALL_CONF_VIEW) || (ad->view_top == VIEW_DIALLING_VIEW)) { + if (ad->view_st[ad->view_top] != NULL) { + ad->view_st[ad->view_top]->onUpdate(ad->view_st[ad->view_top], NULL, NULL); + } + } + + } + break; + + case VC_ENGINE_MSG_EARJACK_STATUS_TO_UI: + { + vc_engine_earjack_status_type earjack_status = msg->earjack_status; + + CALL_UI_DEBUG("earjack Status = %d", earjack_status.bstatus); + CALL_UI_DEBUG("ad->view_top:[%d]", ad->view_top); + + if(earjack_status.bstatus == EINA_TRUE) { + if (ad->ctxpopup_radio_group_eo != NULL ) + elm_radio_value_set(ad->ctxpopup_radio_group_eo, VCUI_SND_PATH_EARJACK); +#ifdef _NEW_SND_ +#else + _vcui_engine_change_sound_path(VCUI_AUDIO_EARJACK); +#endif + + ad->speaker_status = EINA_FALSE; + ad->headset_status = EINA_FALSE; + + if ((ad->view_top == VIEW_INCALL_ONECALL_VIEW) || (ad->view_top == VIEW_INCALL_MULTICALL_SPLIT_VIEW) + || (ad->view_top == VIEW_INCALL_MULTICALL_CONF_VIEW) || (ad->view_top == VIEW_DIALLING_VIEW)) { + if (ad->view_st[ad->view_top] != NULL) { + ad->view_st[ad->view_top]->onUpdate(ad->view_st[ad->view_top], NULL, NULL); + } + } + } else { + if (_vcui_is_headset_conected() == EINA_TRUE) { + if (ad->ctxpopup_radio_group_eo != NULL ) + elm_radio_value_set(ad->ctxpopup_radio_group_eo, VCUI_SND_PATH_HEADSET); + +#ifdef _NEW_SND_ +#else + _vcui_engine_change_sound_path(VCUI_AUDIO_HEADSET); +#endif + + ad->speaker_status = EINA_FALSE; + ad->headset_status = EINA_TRUE; + + if ((ad->view_top == VIEW_INCALL_ONECALL_VIEW) || (ad->view_top == VIEW_INCALL_MULTICALL_SPLIT_VIEW) + || (ad->view_top == VIEW_INCALL_MULTICALL_CONF_VIEW) || (ad->view_top == VIEW_DIALLING_VIEW)) { + if (ad->view_st[ad->view_top] != NULL) { + ad->view_st[ad->view_top]->onUpdate(ad->view_st[ad->view_top], NULL, NULL); + } + } + } else { + if (ad->ctxpopup_radio_group_eo != NULL ) + elm_radio_value_set(ad->ctxpopup_radio_group_eo, VCUI_SND_PATH_EARJACK); + +#ifdef _NEW_SND_ +#else + _vcui_engine_change_sound_path(VCUI_AUDIO_EARJACK); +#endif + + ad->speaker_status = EINA_FALSE; + ad->headset_status = EINA_FALSE; + + if ((ad->view_top == VIEW_INCALL_ONECALL_VIEW) || (ad->view_top == VIEW_INCALL_MULTICALL_SPLIT_VIEW) + || (ad->view_top == VIEW_INCALL_MULTICALL_CONF_VIEW) || (ad->view_top == VIEW_DIALLING_VIEW)) { + if (ad->view_st[ad->view_top] != NULL) { + ad->view_st[ad->view_top]->onUpdate(ad->view_st[ad->view_top], NULL, NULL); + } + } + } + } + } + break; + + case VC_ENGINE_MSG_ACTION_INCOM_FORCE_TO_UI: + { + call_data_t *recent_mo = _vcui_doc_get_recent_mo(); + if (recent_mo != NULL && recent_mo->call_handle == NO_HANDLE) { + _vcui_doc_remove_call_data_only_list(recent_mo); + _vcui_doc_set_mo_recent(NULL); + } + + } + break; + + case VC_ENGINE_MSG_MESSAGE_BOX_TO_UI: + { + _voicecall_dvc_control_lcd_state(VC_LCD_ON_UNLOCK); + + vc_engine_msg_box_type msg_box = msg->msg_box; + _vcui_view_popup_load(_(gszcall_error_msg[msg_box.string_id]), POPUP_TIMEOUT_LONG, EINA_TRUE); + } + break; + + case VC_ENGINE_MSG_REDIAL_TO_UI: + { + CALL_UI_DEBUG("not used"); + } + break; + + case VC_ENGINE_MSG_CREATE_NEWVOICEFILE_TO_UI: + { + CALL_UI_DEBUG("not used"); + } + + default: + break; + } + + _vcui_doc_all_print(gszcall_callback_msg[event]); + + CALL_UI_DEBUG("End.."); + +} diff --git a/ui/vcui-engine-interface.h b/ui/vcui-engine-interface.h new file mode 100755 index 0000000..01d12ef --- /dev/null +++ b/ui/vcui-engine-interface.h @@ -0,0 +1,132 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VOICE_CALL_UI_IPC_ +#define _VOICE_CALL_UI_IPC_ + +#include "voice-call-engine.h" + +typedef enum _vcui_snd_path_type_t{ + VCUI_SND_PATH_NONE, + VCUI_SND_PATH_HEADSET, + VCUI_SND_PATH_EARJACK, + VCUI_SND_PATH_SPEAKER, + VCUI_SND_PATH_MAX, +}vcui_snd_path_type_t; + +typedef enum _vcui_call_type_t { + VCUI_CALL_TYPE_MO, + VCUI_CALL_TYPE_MT, + VCUI_CALL_TYPE_ECC, + VCUI_CALL_TYPE_ECC_TEST, + VCUI_CALL_TYPE_DOWNLOAD_CALL, + VCUI_CALL_TYPE_SAT, + VCUI_CALL_TYPE_MAX +} vcui_call_type_t; + +typedef struct _vcui_call_mo_data_t { + char call_number[VC_PHONE_NUMBER_LENGTH_MAX]; + int ct_index; +} vcui_call_mo_data_t; + +typedef struct _vcui_call_mt_data_t { + int call_handle; + int call_type; + int cli_presentation_indicator; + char call_num[VC_PHONE_NUMBER_LENGTH_MAX]; + int calling_name_mode; + char calling_name[VC_PHONE_NAME_LENGTH_MAX]; + char redirected_number[VC_PHONE_NUMBER_LENGTH_MAX]; + char redirected_sub_address[VC_PHONE_SUBADDRESS_LENGTH_MAX]; + int cli_cause; + int bfwded; + int active_line; +} vcui_call_mt_data_t; + +typedef struct _vcui_call_ecc_data_t { + char call_number[VC_PHONE_NUMBER_LENGTH_MAX]; +} vcui_call_ecc_data_t; + +typedef struct _vcui_call_sat_data_t { + int command_id; /**priv; + vcui_app_call_data_t *ad = vd->app_data; + + /* ============ Check valid Evas Object ============= */ + int valid = 0; + valid = _vcui_check_valid_eo(priv->contents, "ENDCALLVIEW"); + if (valid == -1) { + CALL_UI_DEBUG("[========== ENDCALLVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + return; + } + /* ============ Check valid Evas Object ============= */ + + if (ad->call_end_type == CALL_END_TYPE_SINGLE_CALL) { + CALL_UI_DEBUG("CALL_END_TYPE_SINGLE_CALL type end screen"); + + /* call image */ + _vcui_delete_contact_image(priv->contents); + if (strcmp((char *)call_data->call_file_path, NOIMG_ICON) == 0 && strcmp((char *)call_data->call_full_file_path, NOIMG_ICON) == 0) { + _vcui_show_wallpaper_image(priv->contents); + } else { + if (strcmp((char *)call_data->call_full_file_path, NOIMG_ICON) == 0) { /* normal size */ + _vcui_show_wallpaper_image(priv->contents); + priv->ic = _vcui_show_contact_image(priv->contents, vd->app_data->win_main, call_data->call_file_path); + } else { /* full size */ + _vcui_set_full_image(priv->contents, vd->app_data->win_main, call_data->call_full_file_path); + } + } + + /* call name (if nothing, call number) */ + if (strlen((char *)call_data->call_display) == 0) { + edje_object_part_text_set(_EDJ(eo), "txt_call_name", (char *)call_data->call_num); + edje_object_signal_emit(_EDJ(eo), "show-all-buttons", "end-screen"); + } else { + edje_object_part_text_set(_EDJ(eo), "txt_call_name", (char *)call_data->call_display); + edje_object_part_text_set(_EDJ(eo), "txt_contact_phone_type", (char *)call_data->call_num); + edje_object_signal_emit(_EDJ(eo), "show-some-buttons", "end-screen"); + } + + _vcui_view_common_set_each_time(call_data->start_time); + } else if (ad->call_end_type == CALL_END_TYPE_CONF_CALL) { + CALL_UI_DEBUG("CALL_END_TYPE_CONF_CALL type end screen"); + char buf[DEF_BUF_LEN] = { 0, }; + + /* Conference image */ + _vcui_show_wallpaper_image(priv->contents); + priv->ic = _vcui_show_default_image(priv->contents, vd->app_data->win_main, CONF_ICON); + if (priv->call_status == CALL_HOLD) { + double scale_factor = 0.0; + scale_factor = elm_config_scale_get(); + CALL_UI_DEBUG("scale_factor %f", scale_factor); + + if (scale_factor == 1.0) { + edje_object_signal_emit(_EDJ(priv->contents), "SHOW_DIM_HD", "CID_HD"); + } else { + edje_object_signal_emit(_EDJ(priv->contents), "SHOW_DIM_WVGA", "CID_WVGA"); + } + } else { + edje_object_signal_emit(_EDJ(priv->contents), "HIDE_DIM", "CID"); + } + + edje_object_part_text_set(_EDJ(eo), "txt_call_name", _("IDS_CALL_OPT_CONFERENCE_CALL")); + snprintf(buf, DEF_BUF_LEN, "%d %s", (_vcui_doc_get_count_hold() + _vcui_doc_get_count_unhold()), _("IDS_CALL_BODY_PEOPLE")); + edje_object_part_text_set(_EDJ(eo), "txt_contact_phone_type", buf); /* in case of multicallconf, it is num of people */ + + _vcui_create_top_left_button_disabled(vd); + _vcui_create_top_middle_button_disabled(vd); + _vcui_create_top_right_button_disabled(vd); + _vcui_create_bottom_left_button_disabled(vd); + _vcui_create_bottom_middle_button_disabled(vd); + _vcui_create_bottom_right_button_disabled(vd); + + _vcui_create_button_bigend_disabled(vd); + + } else { + CALL_UI_DEBUG("invalid type... return"); + return; + } + + evas_object_show(eo); +} + +static Evas_Object *__vcui_view_callend_create_contents(void *data) +{ + if (data == NULL) { + CALL_UI_DEBUG("ERROR"); + return NULL; + } + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_app_call_data_t *ad = vd->app_data; + Evas_Object *eo = NULL; + + /* load edje */ + if (ad->call_end_type == CALL_END_TYPE_SINGLE_CALL) + eo = _vcui_load_edj(vd->app_data->win_main, EDJ_NAME, GRP_END_SINGLECALL); + else if (ad->call_end_type == CALL_END_TYPE_CONF_CALL) + eo = _vcui_load_edj(vd->app_data->win_main, EDJ_NAME, GRP_END_CONFCALL); + + if (eo == NULL) + return NULL; + + return eo; +} + +static Evas_Object *__vcui_view_callend_create_layout_main(Evas_Object *parent) +{ + if (parent == NULL) { + CALL_UI_DEBUG("ERROR"); + return NULL; + } + + Evas_Object *ly; + ly = elm_layout_add(parent); + retvm_if(ly == NULL, NULL, "Failed elm_layout_add."); + + elm_layout_theme_set(ly, "standard", "window", "integration"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(parent, ly); + + edje_object_signal_emit(_EDJ(ly), "elm,state,show,indicator", "elm"); + edje_object_signal_emit(_EDJ(ly), "elm,state,show,content", "elm"); + evas_object_show(ly); + + return ly; +} + +static int __vcui_view_callend_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3) +{ + CALL_UI_DEBUG("endcall view create"); + voice_call_view_data_t *vd = view_data; + vcui_app_call_data_t *ad = vd->app_data; + endcall_view_priv_t *priv = (endcall_view_priv_t *)vd->priv; + + CALL_UI_DEBUG("call_end_type[%d]", ad->call_end_type); + if (ad->call_end_type == CALL_END_TYPE_SINGLE_CALL) { + call_data = (call_data_t *)param2; + } else if (ad->call_end_type == CALL_END_TYPE_CONF_CALL) { + priv->call_status = _vcui_doc_get_show_callstatus(); + call_data = _vcui_doc_get_last_status(priv->call_status); + } + + if (call_data == NULL) { + CALL_UI_DEBUG("call Data is NULL"); + return; + } + + if (!vd->layout) { + + /* Create Main Layout */ + vd->layout = __vcui_view_callend_create_layout_main(vd->app_data->win_main); + if (vd->layout == NULL) { + CALL_UI_DEBUG("ERROR"); + return VC_ERROR; + } + /* Create Contents */ + priv->contents = __vcui_view_callend_create_contents(vd); + elm_object_part_content_set(vd->layout, "elm.swallow.content", priv->contents); + + evas_object_name_set(priv->contents, "ENDCALLVIEW"); + CALL_UI_DEBUG("[========== ENDCALLVIEW: priv->contents Addr : [%p] ==========]", priv->contents); + + } else { + CALL_UI_DEBUG("[UI]ad->layout_end call==NULL case "); + evas_object_show(vd->layout); + } + + __vcui_view_callend_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_callend_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2) +{ + CALL_UI_DEBUG("end call view update"); + + __vcui_view_callend_onshow(view_data); + + return VC_NO_ERROR; +} + +static int __vcui_view_callend_onhide(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("end call view hide"); + + evas_object_hide(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_callend_onshow(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("end call view show"); + CALL_UI_KPI("__vcui_view_callend_onshow start"); + endcall_view_priv_t *priv = (endcall_view_priv_t *)view_data->priv; + + __vcui_view_callend_draw_screen(priv->contents, view_data); + + evas_object_hide(view_data->layout); + evas_object_show(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_callend_ondestroy(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("endcall view destroy"); + + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + voice_call_view_data_t *vd = ad->view_st[VIEW_ENDCALL_VIEW]; + endcall_view_priv_t *priv = (endcall_view_priv_t *)vd->priv; + + if (priv != NULL) { + if (priv->contents) { + evas_object_del(priv->contents); + priv->contents = NULL; + } + + free(priv); + priv = NULL; + } + + if (vd->layout != NULL) { + evas_object_hide(vd->layout); + evas_object_del(vd->layout); + vd->layout = NULL; + } + + ad->view_st[VIEW_ENDCALL_VIEW] = NULL; + call_data = NULL; + ad->call_end_type = CALL_END_TYPE_NONE; + + _vcui_cache_flush(); + CALL_UI_DEBUG("complete destroy one view"); + return VC_NO_ERROR; +} diff --git a/ui/vcui-view-callend.h b/ui/vcui-view-callend.h new file mode 100755 index 0000000..df0dceb --- /dev/null +++ b/ui/vcui-view-callend.h @@ -0,0 +1,25 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +typedef struct { + Evas_Object *contents; + Evas_Object *ic; /* small size call image */ + Evas_Object *record_btn; + vcui_app_call_status_t call_status; +} endcall_view_priv_t; + +voice_call_view_data_t *_vcui_view_callend_new(vcui_app_call_data_t *ad); diff --git a/ui/vcui-view-choice.c b/ui/vcui-view-choice.c new file mode 100755 index 0000000..c3d688a --- /dev/null +++ b/ui/vcui-view-choice.c @@ -0,0 +1,205 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-app-data.h" +#include "vcui-view-choice.h" +#include "vcui-view-dialing.h" +#include "vcui-view-incoming.h" +#include "vcui-view-incoming-lock.h" +#include "vcui-view-single-call.h" +#include "vcui-view-multi-call-list.h" +#include "vcui-view-multi-call-split.h" +#include "vcui-view-multi-call-conf.h" +#include "vcui-view-keypad.h" +#include "vcui-view-callend.h" +static const char *vcui_view_name[] = { + "VIEW_DIALLING_VIEW", + "VIEW_INCOMING_VIEW", + "VIEW_INCOMING_LOCK_VIEW", + "VIEW_INCALL_ONECALL_VIEW", + "VIEW_INCALL_MULTICALL_SPLIT_VIEW", + "VIEW_INCALL_MULTICALL_CONF_VIEW", + "VIEW_INCALL_MULTICALL_LIST_VIEW", + "VIEW_INCALL_KEYPAD_VIEW", + "VIEW_ENDCALL_VIEW", + "VIEW_MAX", +}; + +void _vcui_view_change(vcui_app_call_view_id_t view_id, int param1, void *param2, void *param3) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + int valid = 0; + CALL_UI_DEBUG("view:[%d] -> [%d]", ad->view_top, view_id); + if (view_id >= VIEW_MAX) { + CALL_UI_DEBUG("[=========== ERROR!!!! Invalid View ID : %d =================]", view_id); + return; + } + ad->ball_view_hide = EINA_FALSE; +#ifdef _DESTROY_UG_ALL_FORCE_ + if (ad->ugs_array_data.ug_count != 0) + _vcui_doc_launch_destroy_ug_all(&(ad->ugs_array_data)); +#else + if (ad->ugs_array_data.ug_count != 0) { + Eina_List *l; + struct ui_gadget *ug; + EINA_LIST_FOREACH(ad->ugs_array_data.ug_lists, l, ug) { + CALL_UI_DEBUG("Destroy UG due to _vcui_view_change"); + ug_destroy(ug); + } + ad->ugs_array_data.ug_lists = eina_list_free(ad->ugs_array_data.ug_lists); + ad->ugs_array_data.ug_count = 0; + ad->ugs_array_data.last_ug_type = VCUI_UG_TYPE_NOE; + } +#endif + if (ad->view_st[view_id]) { + CALL_UI_DEBUG("[============ Layout exists !! ============]"); + voice_call_view_data_t *vd = (voice_call_view_data_t *) ad->view_st[view_id]; + if (vd->layout) { + if (view_id == VIEW_DIALLING_VIEW) { + vcui_view_dialing_priv_t *priv = (vcui_view_dialing_priv_t *) vd->priv; + valid = _vcui_check_valid_eo(priv->contents, "DIALVIEW"); + } else if (view_id == VIEW_INCOMING_VIEW) { + incoming_view_priv_t *priv = (incoming_view_priv_t *) vd->priv; + valid = _vcui_check_valid_eo(priv->contents, "INCOMINGVIEW"); + } else if (view_id == VIEW_INCOMING_LOCK_VIEW) { + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *) vd->priv; + valid = _vcui_check_valid_eo(priv->contents, "INCOMINGLOCKVIEW"); + } else if (view_id == VIEW_INCALL_ONECALL_VIEW) { + incall_one_view_priv_t *priv = (incall_one_view_priv_t *) vd->priv; + valid = _vcui_check_valid_eo(priv->contents, "ONEVIEW"); + } else if (view_id == VIEW_INCALL_MULTICALL_SPLIT_VIEW) { + incall_multi_view_split_priv_t *priv = (incall_multi_view_split_priv_t *) vd->priv; + valid = _vcui_check_valid_eo(priv->contents, "MULTIVIEWSPLIT"); + } else if (view_id == VIEW_INCALL_MULTICALL_CONF_VIEW) { + vcui_view_multi_call_conf_priv_t *priv = (vcui_view_multi_call_conf_priv_t *) vd->priv; + valid = _vcui_check_valid_eo(priv->contents, "MULTIVIEWCONF"); + } else if (view_id == VIEW_INCALL_MULTICALL_LIST_VIEW) { + vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *) vd->priv; + valid = _vcui_check_valid_eo(priv->contents, "MULTIVIEWLIST"); + } else if (view_id == VIEW_INCALL_KEYPAD_VIEW) { + vcui_view_keypad_priv_t *priv = (vcui_view_keypad_priv_t *) vd->priv; + valid = _vcui_check_valid_eo(priv->contents, "KEYPADVIEW"); + } else if (view_id == VIEW_ENDCALL_VIEW) { + endcall_view_priv_t *priv = (endcall_view_priv_t *) vd->priv; + valid = _vcui_check_valid_eo(priv->contents, "ENDCALLVIEW"); + } else { + CALL_UI_DEBUG("[============ BAD INPUT!!!! Check Input Layout!!!!! %d============]", view_id); + } + if (valid == -1) { + CALL_UI_DEBUG("[========== WARNING!! Invalid Evas Object ==========]"); + ad->view_st[view_id] = NULL; + + /* free priv */ + } + } + } else { + CALL_UI_DEBUG("[============ Create Layout !! ============]"); + } + ad->view_before_top = ad->view_top; /* hold the current top window in the before_top pointer */ + ad->view_top = view_id; /* set the new top window to the view_id which is passed... this step enables in setting 00:00:00 as timer */ + if (view_id == VIEW_DIALLING_VIEW || view_id == VIEW_INCOMING_VIEW || view_id == VIEW_INCOMING_LOCK_VIEW) { + _vcui_raise_main_win(); + } + if ((ad->view_before_top != -1) && (ad->view_before_top != view_id)) { + CALL_UI_DEBUG("hide & destory [%d]", ad->view_before_top); + CALL_UI_KPI("%s onHide start", vcui_view_name[ad->view_before_top]); + ad->view_st[ad->view_before_top]->onHide(ad->view_st[ad->view_before_top]); + CALL_UI_KPI("%s onHide done", vcui_view_name[ad->view_before_top]); + CALL_UI_KPI("%s onDestroy start", vcui_view_name[ad->view_before_top]); + ad->view_st[ad->view_before_top]->onDestroy(ad->view_st[ad->view_before_top]); + CALL_UI_KPI("%s onDestroy done", vcui_view_name[ad->view_before_top]); + } + if (ad->view_st[view_id] == NULL) { + CALL_UI_DEBUG("Create view data"); + voice_call_view_data_t *view_data = ad->func_new[view_id] (ad); + ad->view_st[view_id] = view_data; + } + if (ad->view_st[view_id]->layout == NULL) { + CALL_UI_DEBUG("Create layout"); + CALL_UI_KPI("%s onCreate start", vcui_view_name[view_id]); + ad->view_st[view_id]->onCreate(ad->view_st[view_id], param1, param2, param3); + CALL_UI_KPI("%s onCreate done", vcui_view_name[view_id]); + } else { + CALL_UI_DEBUG("Update layout"); + CALL_UI_KPI("%s onUpdate start", vcui_view_name[view_id]); + ad->view_st[view_id]->onUpdate(ad->view_st[view_id], param2, param3); + CALL_UI_KPI("%s onUpdate done", vcui_view_name[view_id]); + } + _vcui_show_main_ui_set_flag(); + CALL_UI_DEBUG("End"); +} + +void _vcui_view_auto_change() +{ + CALL_UI_DEBUG(".."); + if (_vcui_doc_get_count_nostatus() == 1) { + call_data_t *call_data = _vcui_doc_get_all_recent(); + if (call_data->mo_mt_status == CALL_OUTGOING) { + _vcui_view_change(VIEW_DIALLING_VIEW, 0, NULL, NULL); + } else if (call_data->mo_mt_status == CALL_INCOMING) { + if (_vcui_is_idle_lock() == CALL_UNLOCK) + _vcui_view_change(VIEW_INCOMING_VIEW, 0, NULL, NULL); + + else + _vcui_view_change(VIEW_INCOMING_LOCK_VIEW, 0, NULL, NULL); + } else { + CALL_UI_DEBUG("ERROR"); + } + } else if (_vcui_doc_get_count() > 1) { + if (_vcui_doc_get_count_unhold() == 0 || _vcui_doc_get_count_hold() == 0) { + _vcui_view_change(VIEW_INCALL_MULTICALL_CONF_VIEW, 0, NULL, NULL); + } else { + _vcui_view_change(VIEW_INCALL_MULTICALL_SPLIT_VIEW, 0, NULL, NULL); + } + } else { + _vcui_view_change(VIEW_INCALL_ONECALL_VIEW, 0, NULL, NULL); + } + CALL_UI_DEBUG("End.."); +} + +void _vcui_view_all_hide() +{ + int i = 0; + vcui_app_call_data_t *ad = _vcui_get_app_data(); + for (i = 0; i < VIEW_MAX; i++) { + if (ad->view_st[i] != NULL) { + ad->view_st[i]->onHide(ad->view_st[i]); + } + } + ad->ball_view_hide = EINA_TRUE; + _vcui_show_main_ui_set_flag(); +} + +void _vcui_view_update() +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + if (ad->view_top != -1 && ad->view_st[ad->view_top] != NULL) { + ad->view_st[ad->view_top]->onUpdate(ad->view_st[ad->view_top], NULL, NULL); + } + _vcui_show_main_ui_set_flag(); +} + +void _vcui_view_destroy(vcui_app_call_view_id_t view_id) +{ + CALL_UI_DEBUG("view_id:[%d]", view_id); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + if (ad->view_st[view_id]) { + ad->view_st[view_id]->onHide(ad->view_st[view_id]); + ad->view_st[view_id]->onDestroy(ad->view_st[view_id]); + } +} diff --git a/ui/vcui-view-choice.h b/ui/vcui-view-choice.h new file mode 100755 index 0000000..f50d019 --- /dev/null +++ b/ui/vcui-view-choice.h @@ -0,0 +1,27 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_VIEW_CHOICE_H_ +#define _VCUI_VIEW_CHOICE_H_ + +void _vcui_view_change(vcui_app_call_view_id_t view_id, int param1, void *param2, void *param3); +void _vcui_view_auto_change(); +void _vcui_view_update(); +void _vcui_view_all_hide(); +void _vcui_view_destroy(vcui_app_call_view_id_t view_id); + +#endif /*_VCUI_VIEW_CHOICE_H_*/ diff --git a/ui/vcui-view-common.c b/ui/vcui-view-common.c new file mode 100755 index 0000000..8c1cf06 --- /dev/null +++ b/ui/vcui-view-common.c @@ -0,0 +1,420 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-view-common.h" + +#include "vcui-view-dialing.h" +#include "vcui-view-incoming.h" +#include "vcui-view-single-call.h" +#include "vcui-view-multi-call-split.h" +#include "vcui-view-multi-call-conf.h" +#include "vcui-view-multi-call-list.h" +#include "vcui-view-keypad.h" +#include "vcui-view-callend.h" + +static vcui_view_common_t gincall_common_data; + +void _vcui_view_common_init() +{ + memset(&gincall_common_data, 0, sizeof(vcui_view_common_t)); +} + +static vcui_view_common_t *__vcui_view_common_get_common_data() +{ + return &gincall_common_data; +} + +static Eina_Bool __vcui_view_common_timer_cb(void *data) +{ + //voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + //vcui_app_call_data_t *ad = vd->app_data; + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + char dur[TIME_BUF_LEN]; + static int end_count = 0; + + if (common_data->timer_flag == 1) { + if (common_data->time_end_flag == TIME_END_START) { + end_count = 0; + return 1; + } else if (common_data->time_end_flag == TIME_END_NO) { + end_count++; + if (end_count == 1) { + return 1; + } + } + } + common_data->current_call_time = time(NULL); + + if (common_data->timer_flag == 1) { + if (common_data->current_call_time > common_data->start_call_time) { + time_t call_time = common_data->current_call_time - common_data->start_call_time; + struct tm loctime; + + gmtime_r((const time_t *)&call_time, &loctime); + snprintf(dur, TIME_BUF_LEN, "%02d:%02d:%02d", loctime.tm_hour, loctime.tm_min, loctime.tm_sec); + + _vcui_view_common_set_text_time(dur); + } + } + + return 1; +} + +static Eina_Bool __vcui_view_common_timer_end_cb(void *data) +{ + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + int end_type = common_data->end_type; + char dur[TIME_BUF_LEN]; + + if ((common_data->timer_flag == 1) && (common_data->time_end_flag == TIME_END_START)) { + snprintf(dur, TIME_BUF_LEN, "%02d:%02d:%02d", common_data->hour, common_data->min, common_data->sec); + if (common_data->time_count == 0) { + _vcui_view_common_set_text_time(dur); + } else if (common_data->time_count == 1) { + _vcui_view_common_set_text_time(_(" ")); + } else if (common_data->time_count == 2) { + _vcui_view_common_set_text_time(dur); + } else if (common_data->time_count == 3) { + _vcui_view_common_set_text_time(_(" ")); + } else if (common_data->time_count == 4) { + char data[VC_DATA_LENGTH_MAX] = { 0, }; + _vcui_view_common_set_text_time(_vcui_get_endcause_string(end_type, data)); + } + + common_data->time_count++; + if (common_data->time_count == TIME_END_MAX_SHOW) { + common_data->time_end_flag = TIME_END_NO; + common_data->time_count = 0; + + if (common_data->tm_end) { + ecore_timer_del(common_data->tm_end); + common_data->tm_end = NULL; + } + + _vcui_view_common_call_terminate_or_view_change(); + } + } + return 1; +} + +static Eina_Bool __vcui_view_common_timer_end_dialing_cb(void *data) +{ + CALL_UI_DEBUG(".."); + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + if (common_data->tm_end_dialing) { + ecore_timer_del(common_data->tm_end_dialing); + common_data->tm_end_dialing = NULL; + } + + if (common_data->bredial == EINA_TRUE) { + /*_vcui_view_all_hide();*/ + _vcui_engine_interface_process_auto_redial(EINA_TRUE); + _vcui_view_popup_load_redial(); + _vcui_view_dialing_draw_txt_dialing(ad->view_st[VIEW_DIALLING_VIEW]); + } else { + _vcui_view_common_call_terminate_or_view_change(); + } + + return 1; +} + +static Eina_Bool __vcui_view_common_timer_end_force_cb(void *data) +{ + CALL_UI_DEBUG(".."); + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + + if (common_data->tm_end_force) { + ecore_timer_del(common_data->tm_end_force); + common_data->tm_end_force = NULL; + } + + _vcui_view_common_call_terminate_or_view_change(); + + return 1; +} + +void _vcui_view_common_set_text_time(char *time_dur) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + voice_call_view_data_t *data = ad->view_st[ad->view_top]; + int valid = 0; + + if (data != NULL) { + if (data->type == VIEW_INCALL_ONECALL_VIEW) { + if (data->priv) { + incall_one_view_priv_t *priv = data->priv; + if (priv->contents) { + /* ============ Check valid Evas Object ============= */ + valid = _vcui_check_valid_eo(priv->contents, "ONEVIEW"); + if (valid == -1) { + CALL_UI_DEBUG("[========== ONEVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + return; + } + /* ============ Check valid Evas Object ============= */ + edje_object_part_text_set(_EDJ(priv->contents), "txt_timer", _(time_dur)); //TODO + } else { + CALL_UI_DEBUG("ERR : Null Evas_Object priv->contents"); + } + + } + } else if (data->type == VIEW_INCALL_MULTICALL_SPLIT_VIEW) { + if (data->priv) { + incall_multi_view_split_priv_t *priv = data->priv; + /* ============ Check valid Evas Object ============= */ + valid = _vcui_check_valid_eo(priv->contents, "MULTIVIEWSPLIT"); + if (valid == -1) { + CALL_UI_DEBUG("[========== MULTIVIEWSPLIT : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + return; + } + /* ============ Check valid Evas Object ============= */ + edje_object_part_text_set(_EDJ(priv->contents), "txt_timer", _(time_dur)); //TODO + } else { + CALL_UI_DEBUG("ERR : Null Evas_Object data->layout"); + } + } else if (data->type == VIEW_INCALL_MULTICALL_CONF_VIEW) { + if (data->priv) { + vcui_view_multi_call_conf_priv_t *priv = data->priv; + /* ============ Check valid Evas Object ============= */ + valid = _vcui_check_valid_eo(priv->contents, "MULTIVIEWCONF"); + if (valid == -1) { + CALL_UI_DEBUG("[========== MULTIVIEWCONF : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + return; + } + /* ============ Check valid Evas Object ============= */ + edje_object_part_text_set(_EDJ(priv->contents), "txt_timer", _(time_dur)); //TODO + } else { + CALL_UI_DEBUG("ERR : Null Evas_Object data->layout"); + } + } else if (data->type == VIEW_INCALL_MULTICALL_LIST_VIEW) { + if (data->priv) { + vcui_view_multi_call_list_priv_t *priv = data->priv; + /* ============ Check valid Evas Object ============= */ + valid = _vcui_check_valid_eo(priv->contents, "MULTIVIEWLIST"); + if (valid == -1) { + CALL_UI_DEBUG("[========== MULTIVIEWLIST : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + return; + } + /* ============ Check valid Evas Object ============= */ + edje_object_part_text_set(_EDJ(priv->contents), "txt_timer", _(time_dur)); //TODO + } else { + CALL_UI_DEBUG("ERR : Null Evas_Object data->layout"); + } + } else if (data->type == VIEW_INCALL_KEYPAD_VIEW) { + if (data->priv) { + vcui_view_keypad_priv_t *priv = data->priv; + /* ============ Check valid Evas Object ============= */ + valid = _vcui_check_valid_eo(priv->contents, "KEYPADVIEW"); + if (valid == -1) { + CALL_UI_DEBUG("[========== KEYPADVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + return; + } + /* ============ Check valid Evas Object ============= */ + edje_object_part_text_set(_EDJ(priv->contents), "txt_timer", _(time_dur)); //TODO + } else { + CALL_UI_DEBUG("ERR : Null Evas_Object data->layout"); + } + } else if (data->type == VIEW_ENDCALL_VIEW) { + if (data->priv) { + endcall_view_priv_t *priv = data->priv; + /* ============ Check valid Evas Object ============= */ + valid = _vcui_check_valid_eo(priv->contents, "ENDCALLVIEW"); + if (valid == -1) { + CALL_UI_DEBUG("[========== KEYPADVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + return; + } + /* ============ Check valid Evas Object ============= */ + edje_object_part_text_set(_EDJ(priv->contents), "txt_timer", _(time_dur)); //TODO + } else { + CALL_UI_DEBUG("ERR : Null Evas_Object data->layout"); + } + } else { + /*to do nothing in case of other view.*/ + } + } + } + +void _vcui_view_common_set_each_time(time_t starttime) +{ + time_t curr_time; + //char call_duration[9]; + unsigned long call_duration_in_sec = 0; + unsigned long sec = 0; + unsigned long min = 0; + unsigned long hr = 0; + + curr_time = time(&curr_time); + call_duration_in_sec = curr_time - starttime; + sec = call_duration_in_sec % 60; + min = (call_duration_in_sec / 60) % 60; + hr = call_duration_in_sec / 3600; + + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + + // set the start time for every call + common_data->start_call_time = starttime; + CALL_UI_DEBUG(" common_data->start_call_time %lu", (unsigned long)common_data->start_call_time); + + CALL_UI_DEBUG(" _vcui_view_common_set_each_time curr_time %d starttime %d", (int)curr_time, (int)starttime); + + common_data->sec = sec; + common_data->min = min; + common_data->hour = hr; + + char dur[TIME_BUF_LEN]; + snprintf(dur, TIME_BUF_LEN, "%02d:%02d:%02d", common_data->hour, common_data->min, common_data->sec); + if (common_data->timer_flag == 1) + _vcui_view_common_set_text_time(dur); + + CALL_UI_DEBUG(" complete input time"); + +} + +void _vcui_view_common_timer_text_init() +{ + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + + if (!common_data->tm) { + if (common_data->timer_flag == 0) { + common_data->sec = 0; + common_data->min = 0; + common_data->hour = 0; + common_data->timer_flag = 1; + } + common_data->tm = ecore_timer_add(TIMER_TIMEOUT_1_SEC, __vcui_view_common_timer_cb, NULL); + } +} + +void _vcui_view_common_timer_destroy() +{ + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + if (common_data->tm) { + ecore_timer_del(common_data->tm); + common_data->tm = NULL; + } +} + +void _vcui_view_common_timer_end_destroy() +{ + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + if (common_data->tm_end) { + ecore_timer_del(common_data->tm_end); + common_data->tm_end = NULL; + } +} + +void _vcui_view_common_timer_end_dialing_destroy() +{ + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + if (common_data->tm_end_dialing) { + ecore_timer_del(common_data->tm_end_dialing); + common_data->tm_end_dialing = NULL; + } +} + +void _vcui_view_common_timer_redial_reset() +{ + CALL_UI_DEBUG(".."); + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + + _vcui_view_common_timer_end_destroy(); + _vcui_view_common_timer_end_dialing_destroy(); + common_data->time_end_flag = TIME_END_NO; +} + +void _vcui_view_common_call_end_show_dialing(int end_type, int bredial) +{ + CALL_UI_DEBUG("end_type:[%d]", end_type); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + char data[VC_DATA_LENGTH_MAX] = { 0, }; + + if (ad->call_end_type == CALL_END_TYPE_NONE) { + _vcui_view_dialing_draw_txt_ended(ad->view_st[ad->view_top], end_type); + } else if (ad->call_end_type == CALL_END_TYPE_SINGLE_CALL) { + common_data->time_end_flag = TIME_END_START; // to stop timer from updating the call end screen + _vcui_view_common_set_text_time(_vcui_get_endcause_string(end_type, data)); + } + + if (common_data->tm_end_dialing) { + ecore_timer_del(common_data->tm_end_dialing); + common_data->tm_end_dialing = NULL; + } + common_data->bredial = bredial; + common_data->tm_end_dialing = ecore_timer_add(TIMER_TIMEOUT_2_SEC, __vcui_view_common_timer_end_dialing_cb, NULL); + +} + +void _vcui_view_common_call_end_show(time_t start_time, int end_type) +{ + CALL_UI_DEBUG("end_type:[%d]", end_type); + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + + if (common_data->tm_end) { + ecore_timer_del(common_data->tm_end); + common_data->tm_end = NULL; + } + common_data->time_end_flag = TIME_END_START; + _vcui_view_common_set_each_time(start_time); + + common_data->end_type = end_type; + common_data->tm_end = ecore_timer_add(TIMER_TIMEOUT_0_3_SEC, __vcui_view_common_timer_end_cb, NULL); +} + +void _vcui_view_common_call_end_timer_reset(void) +{ + CALL_UI_DEBUG(".."); + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + if (common_data->tm_end) { + ecore_timer_del(common_data->tm_end); + common_data->tm_end = NULL; + } + + if (common_data->tm_end_dialing) { + ecore_timer_del(common_data->tm_end_dialing); + common_data->tm_end_dialing = NULL; + } + + common_data->tm_end_force = ecore_timer_add(TIMER_TIMEOUT_2_SEC, __vcui_view_common_timer_end_force_cb, NULL); +} + +int _vcui_view_common_call_terminate_or_view_change(void) +{ + CALL_UI_DEBUG(".."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + if (_vcui_doc_get_count() == 0) { + if (ad->contact_ug == NULL) { + CALL_UI_DEBUG("EXIT - contact ug is closed"); + elm_exit(); + } else { + CALL_UI_DEBUG("show contact ug"); + CALL_UI_DEBUG("hide & destory [%d]", ad->view_top); + if (ad->view_top != -1) { + ad->view_st[ad->view_top]->onHide(ad->view_st[ad->view_top]); + ad->view_st[ad->view_top]->onDestroy(ad->view_st[ad->view_top]); + ad->view_top = -1; + } + evas_object_show((Evas_Object *)ug_get_layout(ad->contact_ug)); + } + } else { + _vcui_view_auto_change(); + } + return VC_NO_ERROR; +} diff --git a/ui/vcui-view-common.h b/ui/vcui-view-common.h new file mode 100755 index 0000000..e3f10cf --- /dev/null +++ b/ui/vcui-view-common.h @@ -0,0 +1,69 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VOICE_CALL_UI_INCALL_ +#define _VOICE_CALL_UI_INCALL_ + +#include + +#define TIME_BUF_LEN (16) +#define MIN_SEC (60) +#define HOUR_MIN (60) +#define DAY_HOUR (24) + +#define TB_W (480) +#define TB_H (90) + +typedef struct _vcui_view_common_t { + Ecore_Timer *tm; + Ecore_Timer *tm_end; + Ecore_Timer *tm_end_dialing; + Ecore_Timer *tm_end_force; + + int bredial; + + char sec, min, hour; + int timer_flag; + unsigned int call_time; + + int time_end_flag; + int time_count; + int end_type; + + time_t current_call_time; + time_t start_call_time; +} vcui_view_common_t; + +void _vcui_view_common_set_each_time(time_t starttime); + +void _vcui_view_common_timer_text_init(); + +void _vcui_view_common_set_text_time(char *time_dur); +void _vcui_view_common_init(); + +void _vcui_view_common_call_end_show(time_t start_time, int end_type); +void _vcui_view_common_call_end_show_dialing(int end_type, int bredial); +void _vcui_view_common_call_end_timer_reset(void); + +void _vcui_view_common_timer_destroy(); +void _vcui_view_common_timer_end_destroy(); +void _vcui_view_common_timer_end_dialing_destroy(); +void _vcui_view_common_timer_redial_reset(); + +int _vcui_view_common_call_terminate_or_view_change(void); + +#endif diff --git a/ui/vcui-view-dialing.c b/ui/vcui-view-dialing.c new file mode 100755 index 0000000..b18a144 --- /dev/null +++ b/ui/vcui-view-dialing.c @@ -0,0 +1,368 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-view-dialing.h" +#include "vcui-view-elements.h" + +static int __vcui_view_dialing_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3); +static int __vcui_view_dialing_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2); +static int __vcui_view_dialing_onhide(voice_call_view_data_t *view_data); +static int __vcui_view_dialing_onshow(voice_call_view_data_t *view_data); +static int __vcui_view_dialing_ondestroy(voice_call_view_data_t *view_data); + +static voice_call_view_data_t s_view = { + .type = VIEW_DIALLING_VIEW, + .app_data = NULL, + .layout = NULL, + .onCreate = __vcui_view_dialing_oncreate, + .onUpdate = __vcui_view_dialing_onupdate, + .onHide = __vcui_view_dialing_onhide, + .onShow = __vcui_view_dialing_onshow, + .onDestroy = __vcui_view_dialing_ondestroy, + .priv = NULL, +}; + +voice_call_view_data_t *_vcui_view_dialing_new(vcui_app_call_data_t *ad) +{ + + s_view.app_data = ad; + s_view.priv = calloc(1, sizeof(vcui_view_dialing_priv_t)); + + if (!s_view.priv) { + CALL_UI_DEBUG("ERROR!!!!!!!!!!! "); + } + + return &s_view; +} + +void _vcui_view_dialing_draw_txt_ended(voice_call_view_data_t *vd, int end_type) +{ + /* ============ Check valid Evas Object ============= */ + if (vd == NULL) { + CALL_UI_DEBUG("View Data is NULL"); + return; + } + + vcui_view_dialing_priv_t *priv = (vcui_view_dialing_priv_t *)vd->priv; + + int valid = 0; + valid = _vcui_check_valid_eo(priv->contents, "DIALVIEW"); + if (valid == -1) { + CALL_UI_DEBUG("[========== DIALVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + } else { + char data[VC_DATA_LENGTH_MAX] = { 0, }; + edje_object_part_text_set(_EDJ(priv->contents), "txt_mo_status", _(_vcui_get_endcause_string(end_type, data))); + } + /* ============ Check valid Evas Object ============= */ +} + +void _vcui_view_dialing_draw_txt_connecting(voice_call_view_data_t *vd) +{ + /* ============ Check valid Evas Object ============= */ + if (vd == NULL) { + CALL_UI_DEBUG("View Data is NULL"); + return; + } + + vcui_view_dialing_priv_t *priv = (vcui_view_dialing_priv_t *)vd->priv; + + int valid = 0; + valid = _vcui_check_valid_eo(priv->contents, "DIALVIEW"); + if (valid == -1) { + CALL_UI_DEBUG("[========== DIALVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + } else { + edje_object_part_text_set(_EDJ(priv->contents), "txt_mo_status", _("IDS_CALL_POP_CONNECTING")); + } + /* ============ Check valid Evas Object ============= */ +} + +void _vcui_view_dialing_draw_txt_dialing(voice_call_view_data_t *vd) +{ + /* ============ Check valid Evas Object ============= */ + if (vd == NULL) { + CALL_UI_DEBUG("View Data is NULL"); + return; + } + + vcui_view_dialing_priv_t *priv = (vcui_view_dialing_priv_t *)vd->priv; + + int valid = 0; + valid = _vcui_check_valid_eo(priv->contents, "DIALVIEW"); + if (valid == -1) { + CALL_UI_DEBUG("[========== DIALVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + } else { + edje_object_part_text_set(_EDJ(priv->contents), "txt_mo_status", _("IDS_CALL_POP_DIALLING")); + } + /* ============ Check valid Evas Object ============= */ +} + +static void __vcui_view_dialing_update_screen(Evas_Object *eo, void *data) +{ + CALL_UI_DEBUG(".."); + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_view_dialing_priv_t *priv = (vcui_view_dialing_priv_t *)vd->priv; + + call_data_t *now_call_data = _vcui_doc_get_recent_mo(); + + /* ============ Check valid Evas Object ============= */ + int valid = 0; + valid = _vcui_check_valid_eo(priv->contents, "DIALVIEW"); + if (valid == -1) { + CALL_UI_DEBUG("[========== DIALVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + return; + } + /* ============ Check valid Evas Object ============= */ + + if (now_call_data == NULL) { + CALL_UI_DEBUG("Now Data is NULL"); + return; + } + + /* call image */ + if (strcmp((char *)priv->now_data->call_file_path, NOIMG_ICON) == 0) { + _vcui_show_wallpaper_image(priv->contents); + } else { + CALL_UI_DEBUG("there is caller image."); + + _vcui_show_wallpaper_image(priv->contents); + priv->ic = _vcui_show_contact_image(priv->contents, vd->app_data->win_main, priv->now_data->call_file_path); + } + + /* call name (if nothing, call number) */ + if (strlen((char *)priv->now_data->call_display) == 0) { + edje_object_part_text_set(_EDJ(eo), "txt_call_name", (char *)priv->now_data->call_num); + } else { + edje_object_part_text_set(_EDJ(eo), "txt_call_name", (char *)priv->now_data->call_display); + edje_object_part_text_set(_EDJ(eo), "txt_contact_phone_type", (char *)priv->now_data->call_num); + } + + _vcui_create_top_left_button_disabled(vd); + _vcui_create_top_middle_button_disabled(vd); + _vcui_create_top_right_button_disabled(vd); + _vcui_create_bottom_left_button(vd); + _vcui_create_bottom_middle_button_disabled(vd); + _vcui_create_bottom_right_button_disabled(vd); + + _vcui_create_button_bigend(vd); + + evas_object_show(eo); +} + +static void __vcui_view_dialing_draw_screen(Evas_Object *eo, void *data) +{ + CALL_UI_DEBUG(".."); + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_view_dialing_priv_t *priv = (vcui_view_dialing_priv_t *)vd->priv; + + call_data_t *now_call_data = _vcui_doc_get_recent_mo(); + + /* ============ Check valid Evas Object ============= */ + int valid = 0; + valid = _vcui_check_valid_eo(priv->contents, "DIALVIEW"); + if (valid == -1) { + CALL_UI_DEBUG("[========== DIALVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + return; + } + /* ============ Check valid Evas Object ============= */ + + if (now_call_data == NULL) { + CALL_UI_DEBUG("Now Data is NULL"); + return; + } + + /* call image */ + if (strcmp((char *)priv->now_data->call_file_path, NOIMG_ICON) == 0) { + _vcui_show_wallpaper_image(priv->contents); + } else { + CALL_UI_DEBUG("there is caller image."); + + _vcui_show_wallpaper_image(priv->contents); + priv->ic = _vcui_show_contact_image(priv->contents, vd->app_data->win_main, priv->now_data->call_file_path); + } + + /* call name (if nothing, call number) */ + if (strlen((char *)priv->now_data->call_display) == 0) { + edje_object_part_text_set(_EDJ(eo), "txt_call_name", (char *)priv->now_data->call_num); + } else { + edje_object_part_text_set(_EDJ(eo), "txt_call_name", (char *)priv->now_data->call_display); + edje_object_part_text_set(_EDJ(eo), "txt_contact_phone_type", (char *)priv->now_data->call_num); + } + + edje_object_part_text_set(_EDJ(priv->contents), "txt_mo_status", _("IDS_CALL_POP_DIALLING")); + + _vcui_create_top_left_button_disabled(vd); + _vcui_create_top_middle_button_disabled(vd); + _vcui_create_top_right_button_disabled(vd); + _vcui_create_bottom_left_button(vd); + _vcui_create_bottom_middle_button_disabled(vd); + _vcui_create_bottom_right_button_disabled(vd); + + _vcui_create_button_bigend(vd); + + evas_object_show(eo); +} + +static Evas_Object *__vcui_view_dialing_create_contents(void *data) +{ + CALL_UI_KPI("__vcui_view_dialing_create_contents start"); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + Evas_Object *eo = NULL; + + /* load edje */ + eo = _vcui_load_edj(vd->app_data->win_main, EDJ_NAME, GRP_MOVIEW); + if (eo == NULL) + return NULL; + CALL_UI_KPI("__vcui_view_dialing_create_contents done"); + return eo; +} + +static Evas_Object *__vcui_view_dialing_create_layout_main(Evas_Object *parent) +{ + CALL_UI_KPI("__vcui_view_dialing_create_layout_main start"); + if (parent == NULL) { + CALL_UI_DEBUG("ERROR"); + return NULL; + } + + Evas_Object *ly; + ly = elm_layout_add(parent); + retvm_if(ly == NULL, NULL, "Failed elm_layout_add."); + + elm_layout_theme_set(ly, "standard", "window", "integration"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(parent, ly); + + edje_object_signal_emit(_EDJ(ly), "elm,state,show,indicator", "elm"); + edje_object_signal_emit(_EDJ(ly), "elm,state,show,content", "elm"); + evas_object_show(ly); + CALL_UI_KPI("__vcui_view_dialing_create_layout_main done"); + return ly; +} + +static int __vcui_view_dialing_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3) +{ + CALL_UI_DEBUG("dialling view create!!"); + + vcui_app_call_data_t *ad = view_data->app_data; + vcui_view_dialing_priv_t *priv = view_data->priv; + + if (!view_data->layout) { + + /* Create Main Layout */ + view_data->layout = __vcui_view_dialing_create_layout_main(ad->win_main); + + if (view_data->layout == NULL) { + CALL_UI_DEBUG("ERROR"); + return VC_ERROR; + } + /* Create Contents */ + priv->contents = __vcui_view_dialing_create_contents(view_data); + elm_object_part_content_set(view_data->layout, "elm.swallow.content", priv->contents); + + evas_object_name_set(priv->contents, "DIALVIEW"); + CALL_UI_DEBUG("[========== DIALVIEW: priv->contents Addr : [%p] ==========]", priv->contents); + } + + __vcui_view_dialing_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_dialing_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2) +{ + CALL_UI_DEBUG("dialling view update"); + vcui_view_dialing_priv_t *priv = view_data->priv; + + __vcui_view_dialing_update_screen(priv->contents, view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_dialing_onhide(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("dialling view hide"); + + int valid = 0; + vcui_view_dialing_priv_t *priv = (vcui_view_dialing_priv_t *)view_data->priv; + valid = _vcui_check_valid_eo(priv->contents, "DIALVIEW"); + + if (valid == -1) { + CALL_UI_DEBUG("[========== DIALVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + } + + evas_object_hide(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_dialing_onshow(voice_call_view_data_t *view_data) +{ + CALL_UI_KPI("__vcui_view_dialing_onshow start"); + CALL_UI_DEBUG("dialling view show"); + + vcui_view_dialing_priv_t *priv = view_data->priv; + priv->now_data = _vcui_doc_get_recent_mo(); + if (priv->now_data == NULL) { + CALL_UI_DEBUG("call data is null"); + return VC_ERROR; + } + + __vcui_view_dialing_draw_screen(priv->contents, view_data); + + evas_object_hide(view_data->layout); + evas_object_show(view_data->layout); + + if (_vcui_is_idle_lock() == CALL_LOCK) + _vcui_app_win_set_noti_type(EINA_TRUE); + else + _vcui_app_win_set_noti_type(EINA_FALSE); + + CALL_UI_KPI("__vcui_view_dialing_onshow done"); + + return VC_NO_ERROR; +} + +static int __vcui_view_dialing_ondestroy(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("dialling view destroy"); + + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + voice_call_view_data_t *vd = ad->view_st[VIEW_DIALLING_VIEW]; + vcui_view_dialing_priv_t *priv = (vcui_view_dialing_priv_t *)vd->priv; + + if (priv != NULL) { + if (priv->contents) { + evas_object_del(priv->contents); + priv->contents = NULL; + } + + free(priv); + priv = NULL; + } + + if (vd->layout != NULL) { + evas_object_hide(vd->layout); + evas_object_del(vd->layout); + vd->layout = NULL; + } + + ad->view_st[VIEW_DIALLING_VIEW] = NULL; + + _vcui_cache_flush(); + return VC_NO_ERROR; +} diff --git a/ui/vcui-view-dialing.h b/ui/vcui-view-dialing.h new file mode 100755 index 0000000..f90d6b1 --- /dev/null +++ b/ui/vcui-view-dialing.h @@ -0,0 +1,35 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_VIEW_DIALING_ +#define _VCUI_VIEW_DIALING_ + +typedef struct { + Evas_Object *contents; + Evas_Object *ic; + call_data_t *now_data; +} vcui_view_dialing_priv_t; + + + +voice_call_view_data_t * _vcui_view_dialing_new(vcui_app_call_data_t * ad); + +void _vcui_view_dialing_draw_txt_ended(voice_call_view_data_t *vd, int end_type); +void _vcui_view_dialing_draw_txt_connecting(voice_call_view_data_t *vd); +void _vcui_view_dialing_draw_txt_dialing(voice_call_view_data_t *vd); + +#endif diff --git a/ui/vcui-view-elements.c b/ui/vcui-view-elements.c new file mode 100755 index 0000000..e540f16 --- /dev/null +++ b/ui/vcui-view-elements.c @@ -0,0 +1,1158 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-view-elements.h" +#include "vcui-view-dialing.h" +#include "vcui-view-incoming.h" +#include "vcui-view-single-call.h" +#include "vcui-view-multi-call-conf.h" +#include "vcui-view-multi-call-split.h" +#include "vcui-view-multi-call-list.h" +#include "vcui-view-keypad.h" +#include "vcui-view-callend.h" + +static void __vcui_hold_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_unhold_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_join_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_keypad_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_contacts_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_addcall_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_sound_path_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_spk_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_spk_press_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_mute_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_bigend_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_accept_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_reject_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_second_incoming_reject_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_second_incoming_hold_and_accept_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_second_incoming_end_and_accept_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_second_incoming_end_active_and_accept_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_second_incoming_end_hold_and_accept_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_second_incoming_end_all_and_accept_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_videocall_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_voicecall_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_msg_btn_cb(void *data, Evas_Object *obj, void *event_info); + +static void __vcui_hold_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + _vcui_engine_hold_unhold_swap_call(); +} + +static void __vcui_unhold_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + _vcui_engine_hold_unhold_swap_call(); +} + +void _vcui_swap_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + vcui_app_call_data_t *ad = vd->app_data; + + ad->bholdisleft = ad->bswapped; + _vcui_view_popup_load(_("IDS_CALL_POP_SWAPPED"), POPUP_TIMEOUT_LONG, EINA_FALSE); + _vcui_engine_hold_unhold_swap_call(); +} + +static void __vcui_join_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + _vcui_create_top_right_button_disabled(data); + _vcui_engine_join_call(); +} + +void _vcui_conf_img_cb(void *data, Evas_Object *obj, void *event_info) /* for multicall list view */ +{ + CALL_UI_DEBUG(".."); + _vcui_view_change(VIEW_INCALL_MULTICALL_LIST_VIEW, 0, 0, 0); +} + +static void __vcui_keypad_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + _vcui_view_change(VIEW_INCALL_KEYPAD_VIEW, 0, NULL, NULL); +} + +static void __vcui_contacts_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + _vcui_doc_launch_contact_list_ug(NULL, NULL, vd->layout, NULL, NULL, NULL, &(vd->app_data->ugs_array_data)); +} + +static void __vcui_addcall_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + vcui_app_call_data_t *ad = vd->app_data; + + _vcui_doc_launch_phoneui_ug(NULL, NULL, vd->layout, NULL, NULL, NULL, &(vd->app_data->ugs_array_data)); +} + +static void __vcui_sound_path_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + _vcui_view_popup_load_snd_path(); +} + +static void __vcui_spk_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + vcui_app_call_data_t *ad = vd->app_data; + + CALL_UI_DEBUG("vd->type:[%d]", vd->type); + + _vcui_engine_speaker_on_off(EINA_TRUE); + + ad->speaker_status = EINA_TRUE; + _vcui_create_bottom_left_button(vd); +} + +static void __vcui_spk_press_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + vcui_app_call_data_t *ad = vd->app_data; + + CALL_UI_DEBUG("vd->type:[%d]", vd->type); + + _vcui_engine_speaker_on_off(EINA_FALSE); + + ad->speaker_status = EINA_FALSE; + _vcui_create_bottom_left_button(vd); +} + +static void __vcui_mute_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + vcui_app_call_data_t *ad = vd->app_data; + + CALL_UI_DEBUG("vd->type:[%d]", vd->type); + + _vcui_engine_mute_on_off(EINA_TRUE); + + ad->mute_status = EINA_TRUE; + _vcui_create_bottom_middle_button(vd); +} + +static void __vcui_mute_press_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + vcui_app_call_data_t *ad = vd->app_data; + + CALL_UI_DEBUG("vd->type:[%d]", vd->type); + + _vcui_engine_mute_on_off(EINA_FALSE); + + ad->mute_status = EINA_FALSE; + _vcui_create_bottom_middle_button(vd); +} + +static void __vcui_bigend_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + vcui_app_call_data_t *ad = vd->app_data; + CALL_UI_DEBUG("vd->type:[%d]", vd->type); + + _vcui_create_button_bigend_disabled(vd); + + switch (vd->type) { + case VIEW_DIALLING_VIEW: + { + _vcui_engine_cancel_call(); + } + break; + case VIEW_INCALL_ONECALL_VIEW: + { + _vcui_engine_end_call(); + } + break; + case VIEW_INCALL_MULTICALL_SPLIT_VIEW: + { + _vcui_engine_end_active_calls(); + } + break; + case VIEW_INCALL_MULTICALL_CONF_VIEW: + { + vcui_view_multi_call_conf_priv_t *priv = (vcui_view_multi_call_conf_priv_t *) vd->priv; + if (priv->call_status == CALL_HOLD) + _vcui_engine_end_held_calls(); + else + _vcui_engine_end_active_calls(); + ad->call_end_type = CALL_END_TYPE_CONF_CALL; + } + break; + case VIEW_INCALL_MULTICALL_LIST_VIEW: + { + vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *) vd->priv; + if (priv->call_status == CALL_HOLD) + _vcui_engine_end_held_calls(); + else + _vcui_engine_end_active_calls(); + + int grp_count = 0; + vcall_engine_get_group_count(&grp_count); + CALL_UI_DEBUG("No. of groups - %d", grp_count); + if (grp_count == 1) + ad->call_end_type = CALL_END_TYPE_CONF_CALL; + else + ad->call_end_type = CALL_END_TYPE_NONE; + } + break; + default: + CALL_UI_DEBUG("ERROR - wrong vd type:[%d]", vd->type); + return; + break; + + } +} + +static void __vcui_accept_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + incoming_view_priv_t *priv = (incoming_view_priv_t *) vd->priv; + + if (priv->bselected_btn == EINA_TRUE) { + CALL_UI_DEBUG("already clicked!!"); + } else { + priv->bselected_btn = EINA_TRUE; + _vcui_engine_answer_call(); + } +} + +static void __vcui_reject_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + incoming_view_priv_t *priv = (incoming_view_priv_t *) vd->priv; + + if (priv->bselected_btn == EINA_TRUE) { + CALL_UI_DEBUG("already clicked!!"); + } else { + priv->bselected_btn = EINA_TRUE; + _vcui_engine_reject_call(); + } +} + +static void __vcui_second_incoming_reject_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + _vcui_engine_reject_call(); +} + +static void __vcui_second_incoming_hold_and_accept_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + switch (vd->type) { + case VIEW_INCOMING_VIEW: + { + incoming_view_priv_t *priv = (incoming_view_priv_t *) vd->priv; + priv->bdont_refresh = EINA_TRUE; + } + break; + default: + CALL_UI_DEBUG("ERROR - wrong vd type:[%d]", vd->type); + break; + } + + _vcui_engine_answer_call_by_type(1); +} + +static void __vcui_second_incoming_end_and_accept_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + switch (vd->type) { + case VIEW_INCOMING_VIEW: + { + incoming_view_priv_t *priv = (incoming_view_priv_t *) vd->priv; + priv->bdont_refresh = EINA_TRUE; + } + break; + default: + CALL_UI_DEBUG("ERROR - wrong vd type:[%d]", vd->type); + break; + } + + _vcui_engine_answer_call_by_type(2); +} + +static void __vcui_second_incoming_end_active_and_accept_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + switch (vd->type) { + case VIEW_INCOMING_VIEW: + { + incoming_view_priv_t *priv = (incoming_view_priv_t *) vd->priv; + priv->bdont_refresh = EINA_TRUE; + } + break; + default: + CALL_UI_DEBUG("ERROR - wrong vd type:[%d]", vd->type); + break; + } + + _vcui_engine_answer_call_by_type(2); +} + +static void __vcui_second_incoming_end_hold_and_accept_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + switch (vd->type) { + case VIEW_INCOMING_VIEW: + { + incoming_view_priv_t *priv = (incoming_view_priv_t *) vd->priv; + priv->bdont_refresh = EINA_TRUE; + } + break; + default: + CALL_UI_DEBUG("ERROR - wrong vd type:[%d]", vd->type); + break; + } + + _vcui_engine_answer_call_by_type(3); +} + +static void __vcui_second_incoming_end_all_and_accept_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + switch (vd->type) { + case VIEW_INCOMING_VIEW: + { + incoming_view_priv_t *priv = (incoming_view_priv_t *) vd->priv; + priv->bdont_refresh = EINA_TRUE; + } + break; + default: + CALL_UI_DEBUG("ERROR - wrong vd type:[%d]", vd->type); + break; + } + + _vcui_engine_answer_call_by_type(4); +} + +Evas_Object *_vcui_create_top_left_button(void *data) +{ + return NULL; +} + +Evas_Object *_vcui_create_top_left_button_disabled(void *data) +{ + return NULL; +} + + +Evas_Object *_vcui_create_top_middle_button(void *data) +{ + return NULL; +} + +Evas_Object *_vcui_create_top_middle_button_disabled(void *data) +{ + return NULL; +} + +Evas_Object *_vcui_create_top_right_button(void *data) +{ + return NULL; +} + +Evas_Object *_vcui_create_top_right_button_disabled(void *data) +{ + return NULL; +} + +/* Speaker Button ENABLED */ +Evas_Object *_vcui_create_bottom_left_button(void *data) +{ + CALL_UI_KPI("_vcui_create_bottom_left_button start"); + Evas_Object *btn; + Evas_Object *ic; + Evas_Object *layout; + Evas_Object *sw; + + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + vcui_app_call_data_t *ad = vd->app_data; + + switch (vd->type) { + case VIEW_DIALLING_VIEW: + { + vcui_view_dialing_priv_t *priv = (vcui_view_dialing_priv_t *) vd->priv; + layout = priv->contents; + } + break; + case VIEW_INCALL_ONECALL_VIEW: + { + incall_one_view_priv_t *priv = (incall_one_view_priv_t *) vd->priv; + layout = priv->contents; + } + break; + case VIEW_INCALL_MULTICALL_SPLIT_VIEW: + { + incall_multi_view_split_priv_t *priv = (incall_multi_view_split_priv_t *) vd->priv; + layout = priv->contents; + } + break; + case VIEW_INCALL_MULTICALL_CONF_VIEW: + { + vcui_view_multi_call_conf_priv_t *priv = (vcui_view_multi_call_conf_priv_t *) vd->priv; + layout = priv->contents; + } + break; + default: + CALL_UI_DEBUG("ERROR - wrong vd type:[%d]", vd->type); + return NULL; + break; + + } + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_speaker"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + if (EINA_TRUE == _vcui_is_headset_conected()) { + btn = elm_button_add(layout); + CALL_UI_KPI("elm_object_style_set start :: style_call_sixbtn"); + elm_object_style_set(btn, "style_call_sixbtn"); + CALL_UI_KPI("elm_object_style_set done :: style_call_sixbtn"); + elm_object_part_content_set(layout, "btn_speaker", btn); + ic = elm_icon_add(layout); + elm_icon_file_set(ic, SPEAKER_ICON, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_icon_resizable_set(ic, 1, 1); + elm_object_part_content_set(btn, "icon", ic); + elm_object_text_set(btn, _("IDS_MSGC_OPT_SOUND")); + evas_object_smart_callback_add(btn, "clicked", __vcui_sound_path_btn_cb, vd); + } else { + if (ad->speaker_status == EINA_FALSE) { + btn = elm_button_add(layout); + CALL_UI_KPI("elm_object_style_set start :: style_call_sixbtn"); + elm_object_style_set(btn, "style_call_sixbtn"); + CALL_UI_KPI("elm_object_style_set done :: style_call_sixbtn"); + elm_object_part_content_set(layout, "btn_speaker", btn); + ic = elm_icon_add(layout); + elm_icon_file_set(ic, SPEAKER_ICON, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_icon_resizable_set(ic, 1, 1); + elm_object_part_content_set(btn, "icon", ic); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_SPEAKER")); + evas_object_smart_callback_add(btn, "clicked", __vcui_spk_btn_cb, vd); + } else { + btn = elm_button_add(layout); + CALL_UI_KPI("elm_object_style_set start :: style_call_sixbtn_pressed"); + elm_object_style_set(btn, "style_call_sixbtn_pressed"); + CALL_UI_KPI("elm_object_style_set done :: style_call_sixbtn_pressed"); + elm_object_part_content_set(layout, "btn_speaker", btn); + ic = elm_icon_add(layout); + elm_icon_file_set(ic, SPEAKER_ICON, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_icon_resizable_set(ic, 1, 1); + elm_object_part_content_set(btn, "icon", ic); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_SPEAKER")); + evas_object_smart_callback_add(btn, "clicked", __vcui_spk_press_btn_cb, vd); + } + } + CALL_UI_KPI("_vcui_create_bottom_left_button done"); + return layout; +} + +/* Speaker Button DISABLED */ +Evas_Object *_vcui_create_bottom_left_button_disabled(void *data) +{ + CALL_UI_KPI("_vcui_create_bottom_left_button_disabled start"); + Evas_Object *btn; + Evas_Object *ic; + Evas_Object *layout; + Evas_Object *sw; + + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + switch (vd->type) { + case VIEW_ENDCALL_VIEW: + { + endcall_view_priv_t *priv = (endcall_view_priv_t *) vd->priv; + layout = priv->contents; + } + break; + default: + CALL_UI_DEBUG("ERROR - wrong vd type:[%d]", vd->type); + return NULL; + break; + + } + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_speaker"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + CALL_UI_KPI("elm_object_style_set start :: style_call_sixbtn_disabled"); + elm_object_style_set(btn, "style_call_sixbtn_disabled"); + CALL_UI_KPI("elm_object_style_set done :: style_call_sixbtn_disabled"); + elm_object_part_content_set(layout, "btn_speaker", btn); + ic = elm_icon_add(layout); + elm_icon_file_set(ic, SPEAKER_DISABLED_ICON, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_icon_resizable_set(ic, 1, 1); + elm_object_part_content_set(btn, "icon", ic); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_SPEAKER")); + CALL_UI_KPI("_vcui_create_bottom_left_button_disabled done"); + return layout; +} + +Evas_Object *_vcui_create_bottom_middle_button(void *data) +{ + return NULL; +} + +Evas_Object *_vcui_create_bottom_middle_button_disabled(void *data) +{ + return NULL; +} + +Evas_Object *_vcui_create_bottom_right_button(void *data) +{ + return NULL; +} + + +Evas_Object *_vcui_create_bottom_right_button_disabled(void *data) +{ + return NULL; +} + + +Evas_Object *_vcui_create_button_bigend(void *data) +{ + CALL_UI_KPI("_vcui_create_button_bigend start"); + Evas_Object *btn; + Evas_Object *layout; + Evas_Object *sw; + + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + switch (vd->type) { + case VIEW_DIALLING_VIEW: + { + vcui_view_dialing_priv_t *priv = (vcui_view_dialing_priv_t *) vd->priv; + layout = priv->contents; + } + break; + case VIEW_INCALL_ONECALL_VIEW: + { + incall_one_view_priv_t *priv = (incall_one_view_priv_t *) vd->priv; + layout = priv->contents; + } + break; + case VIEW_INCALL_MULTICALL_SPLIT_VIEW: + { + incall_multi_view_split_priv_t *priv = (incall_multi_view_split_priv_t *) vd->priv; + layout = priv->contents; + } + break; + case VIEW_INCALL_MULTICALL_CONF_VIEW: + { + vcui_view_multi_call_conf_priv_t *priv = (vcui_view_multi_call_conf_priv_t *) vd->priv; + layout = priv->contents; + } + break; + case VIEW_INCALL_MULTICALL_LIST_VIEW: + { + vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *) vd->priv; + layout = priv->contents; + } + break; + default: + CALL_UI_DEBUG("ERROR - wrong vd type:[%d]", vd->type); + return NULL; + break; + + } + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_bigend"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_bigend", btn); + CALL_UI_KPI("elm_object_style_set start :: text_only/style_call_text_only_red"); + elm_object_style_set(btn, "text_only/style_call_text_only_red"); + CALL_UI_KPI("elm_object_style_set done :: text_only/style_call_text_only_red"); + elm_object_text_set(btn, _("IDS_CALL_SK3_END_CALL")); + evas_object_smart_callback_add(btn, "clicked", __vcui_bigend_btn_cb, vd); + CALL_UI_KPI("_vcui_create_button_bigend done"); + return layout; +} + +Evas_Object *_vcui_create_button_bigend_disabled(void *data) +{ + CALL_UI_KPI("_vcui_create_button_bigend_disabled start"); + Evas_Object *btn; + Evas_Object *layout; + Evas_Object *sw; + + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + switch (vd->type) { + case VIEW_DIALLING_VIEW: + { + vcui_view_dialing_priv_t *priv = (vcui_view_dialing_priv_t *) vd->priv; + layout = priv->contents; + } + break; + case VIEW_INCALL_ONECALL_VIEW: + { + incall_one_view_priv_t *priv = (incall_one_view_priv_t *) vd->priv; + layout = priv->contents; + } + break; + case VIEW_INCALL_MULTICALL_SPLIT_VIEW: + { + incall_multi_view_split_priv_t *priv = (incall_multi_view_split_priv_t *) vd->priv; + layout = priv->contents; + } + break; + case VIEW_INCALL_MULTICALL_CONF_VIEW: + { + vcui_view_multi_call_conf_priv_t *priv = (vcui_view_multi_call_conf_priv_t *) vd->priv; + layout = priv->contents; + } + break; + case VIEW_ENDCALL_VIEW: + { + endcall_view_priv_t *priv = (endcall_view_priv_t *) vd->priv; + layout = priv->contents; + } + break; + default: + CALL_UI_DEBUG("ERROR - wrong vd type:[%d]", vd->type); + return NULL; + break; + + } + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_bigend"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_bigend", btn); + CALL_UI_KPI("elm_object_style_set start :: text_only/style_call_text_only_red_disabled"); + elm_object_style_set(btn, "text_only/style_call_text_only_red_disabled"); + CALL_UI_KPI("elm_object_style_set done :: text_only/style_call_text_only_red_disabled"); + elm_object_text_set(btn, _("IDS_CALL_SK3_END_CALL")); + CALL_UI_KPI("_vcui_create_button_bigend_disabled done"); + return layout; +} + +Evas_Object *_vcui_create_conf_list_button_hold(void *data) +{ + return NULL; +} + +Evas_Object *_vcui_create_button_accept(void *data) +{ + Evas_Object *btn; + Evas_Object *layout; + Evas_Object *sw; + + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + switch (vd->type) { + case VIEW_INCOMING_VIEW: + { + incoming_view_priv_t *priv = (incoming_view_priv_t *) vd->priv; + layout = priv->contents; + } + break; + default: + CALL_UI_DEBUG("ERROR - wrong vd type:[%d]", vd->type); + return NULL; + break; + + } + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_accept"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_accept", btn); + CALL_UI_KPI("elm_object_style_set start :: text_only/style_call_text_only_green"); + elm_object_style_set(btn, "text_only/style_call_text_only_green"); + CALL_UI_KPI("elm_object_style_set done :: text_only/style_call_text_only_green"); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_ACCEPT")); + evas_object_smart_callback_add(btn, "clicked", __vcui_accept_btn_cb, vd); + + return layout; +} + +Evas_Object *_vcui_create_button_reject(void *data) +{ + Evas_Object *btn; + Evas_Object *layout; + Evas_Object *sw; + + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + switch (vd->type) { + case VIEW_INCOMING_VIEW: + { + incoming_view_priv_t *priv = (incoming_view_priv_t *) vd->priv; + layout = priv->contents; + } + break; + default: + CALL_UI_DEBUG("ERROR - wrong vd type:[%d]", vd->type); + return NULL; + break; + + } + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_reject"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_reject", btn); + CALL_UI_KPI("elm_object_style_set start :: text_only/style_call_text_only_red"); + elm_object_style_set(btn, "text_only/style_call_text_only_red"); + CALL_UI_KPI("elm_object_style_set done :: text_only/style_call_text_only_red"); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_REJECT")); + evas_object_smart_callback_add(btn, "clicked", __vcui_reject_btn_cb, vd); + + return layout; +} + +Evas_Object *_vcui_create_button_second_incoming_reject(void *data, char *text, char *part_name) +{ + Evas_Object *btn; + Evas_Object *layout; + Evas_Object *sw; + + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + switch (vd->type) { + case VIEW_INCOMING_VIEW: + { + incoming_view_priv_t *priv = (incoming_view_priv_t *) vd->priv; + layout = priv->contents; + } + break; + default: + CALL_UI_DEBUG("ERROR - wrong vd type:[%d]", vd->type); + return NULL; + break; + + } + + sw = edje_object_part_swallow_get(_EDJ(layout), part_name); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, part_name, btn); + CALL_UI_KPI("elm_object_style_set start :: multiline_text_black"); + elm_object_style_set(btn, "multiline_text_black"); + CALL_UI_KPI("elm_object_style_set done :: multiline_text_black"); + elm_object_text_set(btn, text); + evas_object_smart_callback_add(btn, "clicked", __vcui_second_incoming_reject_btn_cb, vd); + + return layout; +} + +Evas_Object *_vcui_create_button_second_incoming_hold_and_accept(void *data, char *text) +{ + return NULL; +} + +Evas_Object *_vcui_create_button_second_incoming_end_and_accept(void *data, char *text) +{ + Evas_Object *btn; + Evas_Object *layout; + Evas_Object *sw; + + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + switch (vd->type) { + case VIEW_INCOMING_VIEW: + { + incoming_view_priv_t *priv = (incoming_view_priv_t *) vd->priv; + layout = priv->contents; + } + break; + default: + CALL_UI_DEBUG("ERROR - wrong vd type:[%d]", vd->type); + return NULL; + break; + + } + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_incoming4"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_incoming4", btn); + CALL_UI_KPI("elm_object_style_set start :: multiline_text_red"); + elm_object_style_set(btn, "multiline_text_red"); + CALL_UI_KPI("elm_object_style_set done :: multiline_text_red"); + elm_object_text_set(btn, text); + evas_object_smart_callback_add(btn, "clicked", __vcui_second_incoming_end_and_accept_btn_cb, vd); + + return layout; +} + +Evas_Object *_vcui_create_button_second_incoming_end_active_and_accept(void *data, char *text) +{ + Evas_Object *btn; + Evas_Object *layout; + Evas_Object *sw; + + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + switch (vd->type) { + case VIEW_INCOMING_VIEW: + { + incoming_view_priv_t *priv = (incoming_view_priv_t *) vd->priv; + layout = priv->contents; + } + break; + default: + CALL_UI_DEBUG("ERROR - wrong vd type:[%d]", vd->type); + return NULL; + break; + + } + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_incoming2"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_incoming2", btn); + CALL_UI_KPI("elm_object_style_set start :: multiline_text_black"); + elm_object_style_set(btn, "multiline_text_black"); + CALL_UI_KPI("elm_object_style_set done :: multiline_text_black"); + elm_object_text_set(btn, text); + evas_object_smart_callback_add(btn, "clicked", __vcui_second_incoming_end_active_and_accept_btn_cb, vd); + + return layout; +} + +Evas_Object *_vcui_create_button_second_incoming_end_hold_and_accept(void *data, char *text) +{ + Evas_Object *btn; + Evas_Object *layout; + Evas_Object *sw; + + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + switch (vd->type) { + case VIEW_INCOMING_VIEW: + { + incoming_view_priv_t *priv = (incoming_view_priv_t *) vd->priv; + layout = priv->contents; + } + break; + default: + CALL_UI_DEBUG("ERROR - wrong vd type:[%d]", vd->type); + return NULL; + break; + + } + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_incoming3"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_incoming3", btn); + CALL_UI_KPI("elm_object_style_set start :: multiline_text_black"); + elm_object_style_set(btn, "multiline_text_black"); + CALL_UI_KPI("elm_object_style_set done :: multiline_text_black"); + elm_object_text_set(btn, text); + evas_object_smart_callback_add(btn, "clicked", __vcui_second_incoming_end_hold_and_accept_btn_cb, vd); + + return layout; +} + +Evas_Object *_vcui_create_button_second_incoming_end_all_and_accept(void *data, char *text) +{ + Evas_Object *btn; + Evas_Object *layout; + Evas_Object *sw; + + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + switch (vd->type) { + case VIEW_INCOMING_VIEW: + { + incoming_view_priv_t *priv = (incoming_view_priv_t *) vd->priv; + layout = priv->contents; + } + break; + default: + CALL_UI_DEBUG("ERROR - wrong vd type:[%d]", vd->type); + return NULL; + break; + + } + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_incoming4"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_incoming4", btn); + CALL_UI_KPI("elm_object_style_set start :: multiline_text_red"); + elm_object_style_set(btn, "multiline_text_red"); + CALL_UI_KPI("elm_object_style_set done :: multiline_text_red"); + elm_object_text_set(btn, text); + evas_object_smart_callback_add(btn, "clicked", __vcui_second_incoming_end_all_and_accept_btn_cb, vd); + + return layout; +} + +Evas_Object *_vcui_show_wallpaper_image(Evas_Object *contents) +{ + return NULL; +} + +Evas_Object *_vcui_show_calling_name_bg(Evas_Object *contents) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + Evas_Object *sw = NULL; + Evas_Object *ic = NULL; + + sw = edje_object_part_swallow_get(_EDJ(contents), "swl_calling_name_bg"); + if (sw) { + edje_object_part_unswallow(_EDJ(contents), sw); + evas_object_del(sw); + } + + ic = elm_icon_add(ad->win_main); + elm_object_part_content_set(contents, "swl_calling_name_bg", ic); + elm_icon_file_set(ic, CALLING_NAME_BG_IMAGE, NULL); + elm_icon_fill_outside_set(ic, EINA_TRUE); + + return ic; +} + +void _vcui_delete_contact_image(Evas_Object *contents) +{ + Evas_Object *sw; + + sw = edje_object_part_swallow_get(_EDJ(contents), "swl_cid"); + if (sw) { + edje_object_part_unswallow(_EDJ(contents), sw); + evas_object_del(sw); + } +} + +Evas_Object *_vcui_show_contact_image(Evas_Object *contents, Evas_Object *win_main, char *path) +{ + Evas_Object *sw; + Evas_Object *ic; + + sw = edje_object_part_swallow_get(_EDJ(contents), "swl_cid"); + if (sw) { + edje_object_part_unswallow(_EDJ(contents), sw); + evas_object_del(sw); + } + + ic = elm_icon_add(win_main); + elm_object_part_content_set(contents, "swl_cid", ic); + elm_icon_file_set(ic, path, NULL); + + return ic; +} + +Evas_Object *_vcui_show_default_image(Evas_Object *contents, Evas_Object *win_main, char *path) +{ + Evas_Object *sw; + Evas_Object *ic; + + sw = edje_object_part_swallow_get(_EDJ(contents), "swl_cid"); + if (sw) { + edje_object_part_unswallow(_EDJ(contents), sw); + evas_object_del(sw); + } + + ic = elm_icon_add(win_main); + elm_object_part_content_set(contents, "swl_cid", ic); + elm_icon_file_set(ic, path, NULL); + + return ic; +} + +void _vcui_set_full_image(Evas_Object *contents, Evas_Object *win_main, char *img_path) +{ + Evas_Object *d_image; + Evas_Object *sw; + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + CALL_UI_DEBUG("path:[%s]", img_path); + + sw = edje_object_part_swallow_get(_EDJ(contents), "swl_cid_background"); + if (sw) { + edje_object_part_unswallow(_EDJ(contents), sw); + evas_object_del(sw); + } + + d_image = elm_image_add(contents); + elm_image_file_set(d_image, img_path, NULL); + elm_object_part_content_set(contents, "swl_cid_background", d_image); +} + +static void __vcui_videocall_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG("__vcui_videocall_btn_cb.."); + char *tel_num = (char *)data; + + bundle *kb; + kb = bundle_create(); + bundle_add(kb, "KEY_CALL_TYPE", "MO"); + bundle_add(kb, "number", tel_num); + aul_launch_app("org.tizen.vtmain", kb); + bundle_free(kb); + + free(tel_num); + tel_num = NULL; + + _vcui_view_common_call_end_timer_reset(); + evas_object_smart_callback_del(obj, "clicked", __vcui_videocall_btn_cb); +} + +static void __vcui_voicecall_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG("__vcui_voicecall_btn_cb.."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + char *tel_num = (char *)data; + vcui_call_type_t call_type; + vcui_call_mo_data_t call_data; + + _vcui_view_common_timer_redial_reset(); + ad->speaker_status = EINA_FALSE; + ad->mute_status = EINA_FALSE; + + memset(&call_data, 0, sizeof(call_data)); + call_type = VCUI_CALL_TYPE_MO; + + snprintf(call_data.call_number, sizeof(call_data.call_number), "%s", tel_num); + + _vcui_engine_interface_process_mo_call(call_type, &call_data); + + free(tel_num); + tel_num = NULL; + + evas_object_smart_callback_del(obj, "clicked", __vcui_voicecall_btn_cb); +} + +static void __vcui_msg_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG("__vcui_msg_btn_cb.."); + char *tel_num = (char *)data; + + _vcui_doc_launch_msg_composer(NULL, tel_num); + + free(tel_num); + tel_num = NULL; + + _vcui_view_common_call_end_timer_reset(); + evas_object_smart_callback_del(obj, "clicked", __vcui_msg_btn_cb); +} + +static void __vcui_add_to_contacts_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG("__vcui_add_to_contacts_btn_cb.."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + voice_call_view_data_t *vd = ad->view_st[VIEW_ENDCALL_VIEW]; + char *tel_num = (char *)data; + + _vcui_doc_launch_add_to_contacts_ug(NULL, NULL, vd->layout, NULL, NULL, NULL, &(vd->app_data->ugs_array_data), tel_num); + + free(tel_num); + tel_num = NULL; + + evas_object_smart_callback_del(obj, "clicked", __vcui_add_to_contacts_btn_cb); +} + +static void __qp_end_btn_cb(void *data, Evas_Object * obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + vcui_app_call_data_t *ad = vd->app_data; + int grp_count = 0; + + vcall_engine_get_group_count(&grp_count); + CALL_UI_DEBUG("No. of groups - %d", grp_count); + + if (grp_count > 1) { + CALL_UI_DEBUG("multi-party call"); + _vcui_engine_end_active_calls(); + } else if (grp_count == 1) { + CALL_UI_DEBUG("single-party call"); + int all_calls = 0, call_status = 0; + all_calls = _vcui_doc_get_count(); + call_status = _vcui_doc_get_show_callstatus(); + CALL_UI_DEBUG("all_calls[%d], call_status[%d]", all_calls, call_status); + + if (all_calls > 1) { + CALL_UI_DEBUG("End active conference call"); + if (call_status == CALL_HOLD) + _vcui_engine_end_held_calls(); + else + _vcui_engine_end_active_calls(); + ad->call_end_type = CALL_END_TYPE_CONF_CALL; /*conf call end screen SHOW*/ + } else if (all_calls == 1) { + CALL_UI_DEBUG("End single active call"); + _vcui_engine_end_call(); + } else { + CALL_UI_DEBUG("invalid case"); + } + } else { + CALL_UI_DEBUG("dialing/connecting screen end"); + _vcui_engine_cancel_call(); + } +} diff --git a/ui/vcui-view-elements.h b/ui/vcui-view-elements.h new file mode 100755 index 0000000..466edf7 --- /dev/null +++ b/ui/vcui-view-elements.h @@ -0,0 +1,56 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VOICE_CALL_UI_CALLBACK_ +#define _VOICE_CALL_UI_CALLBACK_ + +void _vcui_swap_btn_cb(void *data, Evas_Object * obj, void *event_info); +void _vcui_conf_img_cb(void *data, Evas_Object * obj, void *event_info); + +Evas_Object *_vcui_create_top_left_button(void *data); +Evas_Object *_vcui_create_top_left_button_disabled(void *data); +Evas_Object *_vcui_create_top_middle_button(void *data); +Evas_Object *_vcui_create_top_middle_button_disabled(void *data); +Evas_Object *_vcui_create_top_right_button(void *data); +Evas_Object *_vcui_create_top_right_button_disabled(void *data); +Evas_Object *_vcui_create_bottom_left_button(void *data); +Evas_Object *_vcui_create_bottom_left_button_disabled(void *data); +Evas_Object *_vcui_create_bottom_middle_button(void *data); +Evas_Object *_vcui_create_bottom_middle_button_disabled(void *data); +Evas_Object *_vcui_create_bottom_right_button(void *data); +Evas_Object *_vcui_create_bottom_right_button_disabled(void *data); +Evas_Object *_vcui_create_button_bigend(void *data); +Evas_Object *_vcui_create_button_bigend_disabled(void *data); + +Evas_Object *_vcui_create_conf_list_button_hold(void *data); + +Evas_Object *_vcui_create_button_accept(void *data); +Evas_Object *_vcui_create_button_reject(void *data); +Evas_Object *_vcui_create_button_second_incoming_reject(void *data, char *text, char *part_name); +Evas_Object *_vcui_create_button_second_incoming_hold_and_accept(void *data, char *text); +Evas_Object *_vcui_create_button_second_incoming_end_and_accept(void *data, char *text); +Evas_Object *_vcui_create_button_second_incoming_end_active_and_accept(void *data, char *text); +Evas_Object *_vcui_create_button_second_incoming_end_hold_and_accept(void *data, char *text); +Evas_Object *_vcui_create_button_second_incoming_end_all_and_accept(void *data, char *text); + +Evas_Object *_vcui_show_wallpaper_image(Evas_Object *contents); +void _vcui_delete_contact_image(Evas_Object *contents); +Evas_Object *_vcui_show_contact_image(Evas_Object *contents, Evas_Object *win_main, char *path); +Evas_Object *_vcui_show_default_image(Evas_Object *contents, Evas_Object *win_main, char *path); +void _vcui_set_full_image(Evas_Object *contents, Evas_Object *win_main, char *img_path); +Evas_Object *_vcui_show_calling_name_bg(Evas_Object *contents); +#endif /* _VOICE_CALL_UI_CALLBACK_ */ diff --git a/ui/vcui-view-incoming-lock.c b/ui/vcui-view-incoming-lock.c new file mode 100755 index 0000000..18ab954 --- /dev/null +++ b/ui/vcui-view-incoming-lock.c @@ -0,0 +1,421 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-view-incoming-lock.h" + +#define ACCEPT_DIFF_VALUE (130) +#define ACCEPT_DIFF_VALUE_MAX (182) + +#define REJECT_DIFF_VALUE (-130) +#define REJECT_DIFF_VALUE_MAX (-182) + +static int __vcui_view_incoming_lock_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3); +static int __vcui_view_incoming_lock_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2); +static int __vcui_view_incoming_lock_onhide(voice_call_view_data_t *view_data); +static int __vcui_view_incoming_lock_onshow(voice_call_view_data_t *view_data); +static int __vcui_view_incoming_lock_ondestroy(voice_call_view_data_t *view_data); + +static voice_call_view_data_t s_view = { + .type = VIEW_INCOMING_LOCK_VIEW, + .app_data = NULL, + .layout = NULL, + .onCreate = __vcui_view_incoming_lock_oncreate, + .onUpdate = __vcui_view_incoming_lock_onupdate, + .onHide = __vcui_view_incoming_lock_onhide, + .onShow = __vcui_view_incoming_lock_onshow, + .onDestroy = __vcui_view_incoming_lock_ondestroy, + .priv = NULL, +}; + +voice_call_view_data_t *_vcui_view_incoming_lock_new(vcui_app_call_data_t *ad) +{ + + s_view.app_data = ad; + s_view.priv = calloc(1, sizeof(incoming_lock_view_priv_t)); + + if (!s_view.priv) { + CALL_UI_DEBUG("ERROR!!!!!!!!!!!"); + } + + return &s_view; +} + +static Evas_Object *__vcui_view_incoming_lock_load_edj(Evas *evas, char *edjname, const char *grpname) +{ + Evas_Object *edj; + + edj = edje_object_add(evas); + if (!edje_object_file_set(edj, edjname, grpname)) { + CALL_UI_DEBUG("ERROR!!"); + return NULL; + } + + return edj; +} + +static void __vcui_view_incoming_lock_accept_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + Evas_Event_Mouse_Move *ev = event_info; + + priv->accept_start_x = ev->cur.canvas.x; +} + +static void __vcui_view_incoming_lock_accept_mouse_move_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + vcui_app_call_data_t *ad = vd->app_data; + Evas_Event_Mouse_Move *ev = event_info; + + int diff_x = 0; + + priv->accept_cur_x = ev->cur.canvas.x; + diff_x = priv->accept_cur_x - priv->accept_start_x; + + + if (diff_x >= 0) { + if (diff_x < (ACCEPT_DIFF_VALUE * ad->scale_factor)) { + evas_object_move(priv->lock_accept, diff_x, 0); + + edje_object_signal_emit(priv->lock_reject, "lock_reject,default", "prog"); + } else if (diff_x < (ACCEPT_DIFF_VALUE_MAX * ad->scale_factor)) { + evas_object_move(priv->lock_accept, diff_x, 0); + evas_object_move(priv->lock_reject, (diff_x - (ACCEPT_DIFF_VALUE * ad->scale_factor)), 0); + + edje_object_signal_emit(priv->lock_reject, "lock_reject,default", "prog"); + } else { + evas_object_move(priv->lock_accept, (ACCEPT_DIFF_VALUE_MAX * ad->scale_factor), 0); + evas_object_move(priv->lock_reject, ((ACCEPT_DIFF_VALUE_MAX * ad->scale_factor) - (ACCEPT_DIFF_VALUE * ad->scale_factor)), 0); + + edje_object_signal_emit(priv->lock_reject, "lock_reject,alpha", "prog"); + } + } +} + +static void __vcui_view_incoming_lock_accept_mouse_up_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + vcui_app_call_data_t *ad = vd->app_data; + + int diff_x = priv->accept_cur_x - priv->accept_start_x; + + if (diff_x >= (ACCEPT_DIFF_VALUE_MAX * ad->scale_factor)) { + if(_vcui_is_phonelock_status() == EINA_FALSE) + vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_UNLOCK); + _vcui_engine_answer_call(); + } else { + evas_object_move(priv->lock_accept, 0, 0); + evas_object_move(priv->lock_reject, 0, 0); + } + +} + +static Evas_Object *__vcui_view_incoming_lock_create_button_accept(void *data) +{ + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + vcui_app_call_data_t *ad = vd->app_data; + + if(priv->lock_accept != NULL) { + evas_object_del(priv->lock_accept); + priv->lock_accept = NULL; + } + priv->lock_accept = __vcui_view_incoming_lock_load_edj(evas_object_evas_get(ad->win_main), EDJ_NAME, GRP_LOCK_ACCEPT); + evas_object_resize(priv->lock_accept, ad->root_w, ad->root_h); + + evas_object_event_callback_add(priv->lock_accept, EVAS_CALLBACK_MOUSE_DOWN, __vcui_view_incoming_lock_accept_mouse_down_cb, vd); + evas_object_event_callback_add(priv->lock_accept, EVAS_CALLBACK_MOUSE_MOVE, __vcui_view_incoming_lock_accept_mouse_move_cb, vd); + evas_object_event_callback_add(priv->lock_accept, EVAS_CALLBACK_MOUSE_UP, __vcui_view_incoming_lock_accept_mouse_up_cb, vd); + + edje_object_part_text_set(priv->lock_accept, "accept_text", _("IDS_CALL_BUTTON_ACCEPT")); + + evas_object_show(priv->lock_accept); + + return priv->lock_accept; +} + +static void __vcui_view_incoming_lock_reject_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + Evas_Event_Mouse_Move *ev = event_info; + + priv->reject_start_x = ev->cur.canvas.x; +} + +static void __vcui_view_incoming_lock_reject_mouse_move_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + vcui_app_call_data_t *ad = vd->app_data; + Evas_Event_Mouse_Move *ev = event_info; + + int diff_x = 0; + + priv->reject_cur_x = ev->cur.canvas.x; + diff_x = priv->reject_cur_x - priv->reject_start_x; + + if (diff_x <= 0) { + if (diff_x > (REJECT_DIFF_VALUE * ad->scale_factor)) { + evas_object_move(priv->lock_reject, diff_x, 0); + + edje_object_signal_emit(priv->lock_accept, "lock_accept,default", "prog"); + } else if (diff_x > (REJECT_DIFF_VALUE_MAX * ad->scale_factor)) { + evas_object_move(priv->lock_reject, diff_x, 0); + evas_object_move(priv->lock_accept, (diff_x - (REJECT_DIFF_VALUE * ad->scale_factor)), 0); + + edje_object_signal_emit(priv->lock_accept, "lock_accept,default", "prog"); + } else { + evas_object_move(priv->lock_reject, (REJECT_DIFF_VALUE_MAX * ad->scale_factor), 0); + evas_object_move(priv->lock_accept, ((REJECT_DIFF_VALUE_MAX * ad->scale_factor) - (REJECT_DIFF_VALUE * ad->scale_factor)), 0); + + edje_object_signal_emit(priv->lock_accept, "lock_accept,alpha", "prog"); + + } + } +} + +static void __vcui_view_incoming_lock_reject_mouse_up_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + vcui_app_call_data_t *ad = vd->app_data; + + int diff_x = priv->reject_cur_x - priv->reject_start_x; + + if (diff_x <= (REJECT_DIFF_VALUE_MAX * ad->scale_factor)) { +/* vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_UNLOCK);*/ + _vcui_engine_reject_call(); + } else { + evas_object_move(priv->lock_reject, 0, 0); + evas_object_move(priv->lock_accept, 0, 0); + } + +} + +static Evas_Object *__vcui_view_incoming_lock_create_button_reject(void *data) +{ + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + vcui_app_call_data_t *ad = vd->app_data; + + if(priv->lock_reject != NULL) { + evas_object_del(priv->lock_reject); + priv->lock_reject = NULL; + } + priv->lock_reject = __vcui_view_incoming_lock_load_edj(evas_object_evas_get(ad->win_main), EDJ_NAME, GRP_LOCK_REJECT); + evas_object_resize(priv->lock_reject, ad->root_w, ad->root_h); + + evas_object_event_callback_add(priv->lock_reject, EVAS_CALLBACK_MOUSE_DOWN, __vcui_view_incoming_lock_reject_mouse_down_cb, vd); + evas_object_event_callback_add(priv->lock_reject, EVAS_CALLBACK_MOUSE_MOVE, __vcui_view_incoming_lock_reject_mouse_move_cb, vd); + evas_object_event_callback_add(priv->lock_reject, EVAS_CALLBACK_MOUSE_UP, __vcui_view_incoming_lock_reject_mouse_up_cb, vd); + + edje_object_part_text_set(priv->lock_reject, "reject_text", _("IDS_CALL_BUTTON_REJECT")); + + evas_object_show(priv->lock_reject); + + return priv->lock_reject; +} + +static void __vcui_view_incoming_lock_draw_screen(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(".."); + + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + Evas_Object *eo = priv->contents; + vcui_app_call_data_t *ad = vd->app_data; + + priv->now_data = _vcui_doc_get_recent_mt(); + if (priv->now_data == NULL) { + CALL_UI_DEBUG("call data is null"); + return; + } + if (priv->now_data->mo_mt_status != CALL_INCOMING) { + CALL_UI_DEBUG("it is not call_incoming."); + return; + } + + /* call image */ + if (strcmp((char *)priv->now_data->call_file_path, NOIMG_ICON) == 0) { + _vcui_show_wallpaper_image(priv->contents); + } else { + CALL_UI_DEBUG("there is caller image."); + _vcui_show_wallpaper_image(priv->contents); + priv->ic = _vcui_show_contact_image(priv->contents, vd->app_data->win_main, priv->now_data->call_file_path); + } + + /* call name (if nothing, call number) */ + if (strlen((char *)priv->now_data->call_display) == 0) { + edje_object_part_text_set(_EDJ(eo), "txt_call_name", (char *)priv->now_data->call_num); + } else { + edje_object_part_text_set(_EDJ(eo), "txt_call_name", (char *)priv->now_data->call_display); + edje_object_part_text_set(_EDJ(eo), "txt_contact_phone_type", (char *)priv->now_data->call_num); + } + + __vcui_view_incoming_lock_create_button_accept(vd); + __vcui_view_incoming_lock_create_button_reject(vd); + + ad->beffect_needed = EINA_TRUE; + + evas_object_show(eo); + +} + +static Evas_Object *__vcui_view_incoming_lock_create_contents(void *data) +{ + if (data == NULL) { + CALL_UI_DEBUG("ERROR"); + return NULL; + } + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + Evas_Object *eo; + + /* load edje */ + eo = _vcui_load_edj(vd->app_data->win_main, EDJ_NAME, GRP_MTLOCK); + if (eo == NULL) + return NULL; + + return eo; +} + +static Evas_Object *__vcui_view_incoming_lock_create_layout_main(Evas_Object *parent) +{ + if (parent == NULL) { + CALL_UI_DEBUG("ERROR"); + return NULL; + } + + Evas_Object *ly; + ly = elm_layout_add(parent); + retvm_if(ly == NULL, NULL, "Failed elm_layout_add."); + + elm_layout_theme_set(ly, "standard", "window", "integration"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(parent, ly); + + edje_object_signal_emit(_EDJ(ly), "elm,state,show,indicator", "elm"); + edje_object_signal_emit(_EDJ(ly), "elm,state,show,content", "elm"); + evas_object_show(ly); + + return ly; +} + +static int __vcui_view_incoming_lock_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3) +{ + CALL_UI_DEBUG("mt-lock view create!!"); + + vcui_app_call_data_t *ad = view_data->app_data; + incoming_lock_view_priv_t *priv = view_data->priv; + + if (!view_data->layout) { + view_data->layout = __vcui_view_incoming_lock_create_layout_main(ad->win_main); + if (view_data->layout == NULL) { + CALL_UI_DEBUG("ERROR"); + return VC_ERROR; + } + priv->contents = __vcui_view_incoming_lock_create_contents(view_data); + elm_object_part_content_set(view_data->layout, "elm.swallow.content", priv->contents); + + evas_object_name_set(priv->contents, "INCOMINGLOCKVIEW"); + CALL_UI_DEBUG("[========== INCOMINGLOCKVIEW: priv->contents Addr : [%p] ==========]", priv->contents); + + } + + __vcui_view_incoming_lock_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_incoming_lock_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2) +{ + CALL_UI_DEBUG("mt-lock view update!!"); + + __vcui_view_incoming_lock_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_incoming_lock_onhide(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("mt-lock view hide!!"); + + evas_object_hide(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_incoming_lock_onshow(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("mt-lock view show!!"); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + int result = 0; + + __vcui_view_incoming_lock_draw_screen(view_data); + + evas_object_hide(view_data->layout); + evas_object_show(view_data->layout); + _vcui_app_win_set_noti_type(EINA_TRUE); + + return VC_NO_ERROR; +} + +static int __vcui_view_incoming_lock_ondestroy(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("mt-lock view destroy!!"); + + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + voice_call_view_data_t *vd = ad->view_st[VIEW_INCOMING_LOCK_VIEW]; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + + if (_vcui_is_idle_lock() == CALL_LOCK) + _vcui_app_win_set_noti_type(EINA_TRUE); + else + _vcui_app_win_set_noti_type(EINA_FALSE); + + ad->bmute_ringtone = EINA_FALSE; + if (priv != NULL) { + if (priv->lock_accept) { + evas_object_del(priv->lock_accept); + priv->lock_accept = NULL; + } + if (priv->lock_reject) { + evas_object_del(priv->lock_reject); + priv->lock_reject = NULL; + } + if (priv->contents) { + evas_object_del(priv->contents); + priv->contents = NULL; + } + + free(priv); + priv = NULL; + } + + if (vd->layout != NULL) { + evas_object_hide(vd->layout); + evas_object_del(vd->layout); + vd->layout = NULL; + } + + ad->view_st[VIEW_INCOMING_LOCK_VIEW] = NULL; + + _vcui_cache_flush(); + + return VC_NO_ERROR; +} diff --git a/ui/vcui-view-incoming-lock.h b/ui/vcui-view-incoming-lock.h new file mode 100755 index 0000000..57df16f --- /dev/null +++ b/ui/vcui-view-incoming-lock.h @@ -0,0 +1,39 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VOICE_CALL_UI_INCOMING_LOCK_VIEW_ +#define _VOICE_CALL_UI_INCOMING_LOCK_VIEW_ + +typedef struct { + Evas_Object *contents; + Evas_Object *ic; + + Evas_Object *lock_accept; + int accept_start_x; + int accept_cur_x; + + Evas_Object *lock_reject; + int reject_start_x; + int reject_cur_x; + + call_data_t *now_data; + +} incoming_lock_view_priv_t; + +voice_call_view_data_t *_vcui_view_incoming_lock_new(vcui_app_call_data_t *ad); + +#endif diff --git a/ui/vcui-view-incoming.c b/ui/vcui-view-incoming.c new file mode 100755 index 0000000..bd924b5 --- /dev/null +++ b/ui/vcui-view-incoming.c @@ -0,0 +1,350 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-view-incoming.h" +#include "vcui-view-elements.h" + +static int __vcui_view_incoming_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3); +static int __vcui_view_incoming_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2); +static int __vcui_view_incoming_onhide(voice_call_view_data_t *view_data); +static int __vcui_view_incoming_onshow(voice_call_view_data_t *view_data); +static int __vcui_view_incoming_destroy(voice_call_view_data_t *view_data); + +static voice_call_view_data_t s_view = { + .type = VIEW_INCOMING_VIEW, + .app_data = NULL, + .layout = NULL, + .onCreate = __vcui_view_incoming_oncreate, + .onUpdate = __vcui_view_incoming_onupdate, + .onHide = __vcui_view_incoming_onhide, + .onShow = __vcui_view_incoming_onshow, + .onDestroy = __vcui_view_incoming_destroy, + .priv = NULL, +}; + +voice_call_view_data_t *_vcui_view_incoming_new(vcui_app_call_data_t *ad) +{ + + s_view.app_data = ad; + s_view.priv = calloc(1, sizeof(incoming_view_priv_t)); + + if (!s_view.priv) { + CALL_UI_DEBUG("ERROR!!!!!!!!!!! "); + } + + return &s_view; +} + +static void __vcui_view_incoming_clear_button(Evas_Object *eo) +{ + CALL_UI_DEBUG(".."); + Evas_Object *sw; + sw = edje_object_part_swallow_get(_EDJ(eo), "btn_accept"); + if (sw) { + edje_object_part_unswallow(_EDJ(eo), sw); + evas_object_del(sw); + } + sw = edje_object_part_swallow_get(_EDJ(eo), "btn_reject"); + if (sw) { + edje_object_part_unswallow(_EDJ(eo), sw); + evas_object_del(sw); + } + sw = edje_object_part_swallow_get(_EDJ(eo), "btn_incoming1"); + if (sw) { + edje_object_part_unswallow(_EDJ(eo), sw); + evas_object_del(sw); + } + sw = edje_object_part_swallow_get(_EDJ(eo), "btn_incoming2"); + if (sw) { + edje_object_part_unswallow(_EDJ(eo), sw); + evas_object_del(sw); + } + sw = edje_object_part_swallow_get(_EDJ(eo), "btn_incoming3"); + if (sw) { + edje_object_part_unswallow(_EDJ(eo), sw); + evas_object_del(sw); + } + sw = edje_object_part_swallow_get(_EDJ(eo), "btn_incoming4"); + if (sw) { + edje_object_part_unswallow(_EDJ(eo), sw); + evas_object_del(sw); + } +} + +static void __vcui_view_incoming_draw_screen(Evas_Object *eo, void *data) +{ + CALL_UI_DEBUG(".."); + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_view_priv_t *priv = (incoming_view_priv_t *)vd->priv; + vcui_app_call_data_t *ad = vd->app_data; + int hold_cnt = 0; + int active_cnt = 0; + + /* ============ Check valid Evas Object ============= */ + int valid = 0; + valid = _vcui_check_valid_eo(priv->contents, "INCOMINGVIEW"); + if (valid == -1) { + CALL_UI_DEBUG("[========== INCOMINGVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + return; + } + /* ============ Check valid Evas Object ============= */ + + if (strcmp((char *)priv->now_data->call_file_path, NOIMG_ICON) == 0) { + _vcui_show_wallpaper_image(priv->contents); + _vcui_show_calling_name_bg(priv->contents); + } else { + CALL_UI_DEBUG("there is caller image."); + _vcui_show_wallpaper_image(priv->contents); + _vcui_show_calling_name_bg(priv->contents); + priv->ic = _vcui_show_contact_image(priv->contents, vd->app_data->win_main, priv->now_data->call_file_path); + } + + /* call name (if nothing, call number) */ + if (strlen((char *)priv->now_data->call_display) == 0) { + edje_object_part_text_set(_EDJ(eo), "txt_call_name", (char *)priv->now_data->call_num); + } else { + edje_object_part_text_set(_EDJ(eo), "txt_call_name", (char *)priv->now_data->call_display); + edje_object_part_text_set(_EDJ(eo), "txt_contact_phone_type", (char *)priv->now_data->call_num); + } + + active_cnt = _vcui_doc_get_count_unhold(); + hold_cnt = _vcui_doc_get_count_hold(); + CALL_UI_DEBUG("unhold:[%d], hold:[%d]",active_cnt, hold_cnt ); + __vcui_view_incoming_clear_button(priv->contents); /* to change 2nd incoming call view -> normal incoming call view. */ + if (active_cnt == 0) { /* no active call - single mt call or 2nd call(1hold) */ + CALL_UI_DEBUG("normal incoming call"); + + _vcui_create_button_accept(vd); + _vcui_create_button_reject(vd); + + ad->beffect_needed = EINA_TRUE; + } else if (hold_cnt == 0) { /* active call & no hold call - 2nd call(1active) */ + CALL_UI_DEBUG("2nd incoming call-1"); + char text[256] = { 0, }; + _vcui_create_button_second_incoming_reject(vd, _("IDS_CALL_BUTTON_REJECT"), "btn_incoming3"); + memset(text, 0x00, 256); + snprintf(text, 256, "%s + %s", _("IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB"), _("IDS_CALL_BUTTON_ACCEPT")); + _vcui_create_button_second_incoming_hold_and_accept(vd, text); + memset(text, 0x00, 256); + snprintf(text, 256, "%s + %s", _("IDS_CALL_POP_END_ACTIVE_CALL"), _("IDS_CALL_BUTTON_ACCEPT")); + _vcui_create_button_second_incoming_end_and_accept(vd, text); + } else if (active_cnt == 1 && hold_cnt == 1) { /* 1active & 1hold */ + CALL_UI_DEBUG("2nd incoming call - 1ACT & 1HLD"); + char text[256] = { 0, }; + _vcui_create_button_second_incoming_reject(vd, _("IDS_CALL_BUTTON_REJECT"), "btn_incoming1"); + + memset(text, 0x00, 256); + snprintf(text, 256, "%s + %s", _("IDS_CALL_POP_END_ACTIVE_CALL"), _("IDS_CALL_BUTTON_ACCEPT")); + _vcui_create_button_second_incoming_end_active_and_accept(vd, text); + + memset(text, 0x00, 256); + snprintf(text, 256, "%s + %s", _("IDS_CALL_OPT_END_HELD_CALL"), _("IDS_CALL_BUTTON_ACCEPT")); + _vcui_create_button_second_incoming_end_hold_and_accept(vd, text); + + memset(text, 0x00, 256); + snprintf(text, 256, "%s + %s", _("IDS_CALL_OPT_END_ALL_CALLS"), _("IDS_CALL_BUTTON_ACCEPT")); + _vcui_create_button_second_incoming_end_all_and_accept(vd, text); + } else if (active_cnt >= 1 && hold_cnt == 1) { /* 1+active & 1hold */ + CALL_UI_DEBUG("2nd incoming call - [1+]ACT & 1HLD"); + char text[256] = { 0, }; + _vcui_create_button_second_incoming_reject(vd, _("IDS_CALL_BUTTON_REJECT"), "btn_incoming1"); + + memset(text, 0x00, 256); + snprintf(text, 256, "%s(%d) + %s", _("IDS_CALL_POP_END_ACTIVE_CALL"), active_cnt, _("IDS_CALL_BUTTON_ACCEPT")); + _vcui_create_button_second_incoming_end_active_and_accept(vd, text); + + memset(text, 0x00, 256); + snprintf(text, 256, "%s + %s", _("IDS_CALL_OPT_END_HELD_CALL"), _("IDS_CALL_BUTTON_ACCEPT")); + _vcui_create_button_second_incoming_end_hold_and_accept(vd, text); + + memset(text, 0x00, 256); + snprintf(text, 256, "%s + %s", _("IDS_CALL_OPT_END_ALL_CALLS"), _("IDS_CALL_BUTTON_ACCEPT")); + _vcui_create_button_second_incoming_end_all_and_accept(vd, text); + } else if (active_cnt == 1 && hold_cnt >= 1) { /* 1active & 1+hold */ + CALL_UI_DEBUG("2nd incoming call - 1ACT & [1+]HLD"); + char text[256] = { 0, }; + _vcui_create_button_second_incoming_reject(vd, _("IDS_CALL_BUTTON_REJECT"), "btn_incoming1"); + + memset(text, 0x00, 256); + snprintf(text, 256, "%s + %s", _("IDS_CALL_POP_END_ACTIVE_CALL"), _("IDS_CALL_BUTTON_ACCEPT")); + _vcui_create_button_second_incoming_end_active_and_accept(vd, text); + + memset(text, 0x00, 256); + snprintf(text, 256, "%s(%d) + %s", _("IDS_CALL_OPT_END_HELD_CALL"), hold_cnt, _("IDS_CALL_BUTTON_ACCEPT")); + _vcui_create_button_second_incoming_end_hold_and_accept(vd, text); + + memset(text, 0x00, 256); + snprintf(text, 256, "%s + %s", _("IDS_CALL_OPT_END_ALL_CALLS"), _("IDS_CALL_BUTTON_ACCEPT")); + _vcui_create_button_second_incoming_end_all_and_accept(vd, text); + } + CALL_UI_DEBUG("unhold:[%d], hold:[%d]", active_cnt, hold_cnt); + + evas_object_show(eo); +} + +static Evas_Object *__vcui_view_incoming_create_contents(void *data) +{ + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + Evas_Object *eo = NULL; + + /* load edje */ + eo = _vcui_load_edj(vd->app_data->win_main, EDJ_NAME, GRP_MTVIEW); + if (eo == NULL) + return NULL; + + return eo; +} + +static Evas_Object *__vcui_view_incoming_create_layout_main(Evas_Object *parent) +{ + if (parent == NULL) { + CALL_UI_DEBUG("ERROR"); + return NULL; + } + + Evas_Object *ly; + ly = elm_layout_add(parent); + retvm_if(ly == NULL, NULL, "Failed elm_layout_add."); + + elm_layout_theme_set(ly, "standard", "window", "integration"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(parent, ly); + + edje_object_signal_emit(_EDJ(ly), "elm,state,show,indicator", "elm"); + edje_object_signal_emit(_EDJ(ly), "elm,state,show,content", "elm"); + evas_object_show(ly); + + return ly; +} + +static int __vcui_view_incoming_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3) +{ + CALL_UI_DEBUG("incoming view create!!"); + + vcui_app_call_data_t *ad = view_data->app_data; + incoming_view_priv_t *priv = view_data->priv; + + if (!view_data->layout) { + + view_data->layout = __vcui_view_incoming_create_layout_main(ad->win_main); + if (view_data->layout == NULL) { + CALL_UI_DEBUG("ERROR"); + return VC_ERROR; + } + + priv->contents = __vcui_view_incoming_create_contents(view_data); + elm_object_part_content_set(view_data->layout, "elm.swallow.content", priv->contents); + + evas_object_name_set(priv->contents, "INCOMINGVIEW"); + CALL_UI_DEBUG("[========== INCOMINGVIEW: priv->contents Addr : [%p] ==========]", priv->contents); + + } + + __vcui_view_incoming_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_incoming_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2) +{ + CALL_UI_DEBUG("incoming view update"); + incoming_view_priv_t *priv = view_data->priv; + if (priv->bdont_refresh == EINA_TRUE) { + return VC_NO_ERROR; + } + priv->bselected_btn = EINA_FALSE; + __vcui_view_incoming_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_incoming_onhide(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("incoming view hide"); + + int valid = 0; + incoming_view_priv_t *priv = (incoming_view_priv_t *)view_data->priv; + valid = _vcui_check_valid_eo(priv->contents, "INCOMINGVIEW"); + + if (valid == -1) { + CALL_UI_DEBUG("[========== INCOMINGVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + } + + evas_object_hide(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_incoming_onshow(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("incoming view show"); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + int result = 0; + + incoming_view_priv_t *priv = view_data->priv; + priv->now_data = _vcui_doc_get_recent_mt(); + if (priv->now_data == NULL) { + CALL_UI_DEBUG("call data is null"); + return VC_ERROR; + } + + __vcui_view_incoming_draw_screen(priv->contents, view_data); + + evas_object_hide(view_data->layout); + evas_object_show(view_data->layout); + + _vcui_app_win_set_noti_type(EINA_TRUE); + + return VC_NO_ERROR; +} + +static int __vcui_view_incoming_destroy(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("incoming view destroy"); + + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + voice_call_view_data_t *vd = ad->view_st[VIEW_INCOMING_VIEW]; + incoming_view_priv_t *priv = (incoming_view_priv_t *)vd->priv; + + if (_vcui_is_idle_lock() == CALL_LOCK) + _vcui_app_win_set_noti_type(EINA_TRUE); + else + _vcui_app_win_set_noti_type(EINA_FALSE); + + ad->bmute_ringtone = EINA_FALSE; + + if (priv != NULL) { + if (priv->contents) { + evas_object_del(priv->contents); + priv->contents = NULL; + } + + free(priv); + priv = NULL; + } + + if (vd->layout != NULL) { + evas_object_hide(vd->layout); + evas_object_del(vd->layout); + vd->layout = NULL; + } + + ad->view_st[VIEW_INCOMING_VIEW] = NULL; + _vcui_cache_flush(); + + return VC_NO_ERROR; +} diff --git a/ui/vcui-view-incoming.h b/ui/vcui-view-incoming.h new file mode 100755 index 0000000..baaad16 --- /dev/null +++ b/ui/vcui-view-incoming.h @@ -0,0 +1,34 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VOICE_CALL_UI_INCOMING_VIEW_ +#define _VOICE_CALL_UI_INCOMING_VIEW_ + +typedef struct { + Evas_Object *contents; + + call_data_t *now_data; + Evas_Object *ic; + + int bdont_refresh; + int bselected_btn; + +} incoming_view_priv_t; + +voice_call_view_data_t *_vcui_view_incoming_new(vcui_app_call_data_t *ad); + +#endif diff --git a/ui/vcui-view-keypad.c b/ui/vcui-view-keypad.c new file mode 100755 index 0000000..c2294f6 --- /dev/null +++ b/ui/vcui-view-keypad.c @@ -0,0 +1,438 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-view-keypad.h" +#include "vcui-view-common.h" + +static int _vcui_view_keypad_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3); +static int _vcui_view_keypad_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2); +static int _vcui_view_keypad_onhide(voice_call_view_data_t *view_data); +static int _vcui_view_keypad_onshow(voice_call_view_data_t *view_data); +static int _vcui_view_keypad_ondestroy(voice_call_view_data_t *view_data); +static Evas_Object *__vcui_view_keypad_create_single_line_scrolled_entry(void *content); + +static voice_call_view_data_t s_view = { + .type = VIEW_INCALL_KEYPAD_VIEW, + .app_data = NULL, + .layout = NULL, + .onCreate = _vcui_view_keypad_oncreate, + .onUpdate = _vcui_view_keypad_onupdate, + .onHide = _vcui_view_keypad_onhide, + .onShow = _vcui_view_keypad_onshow, + .onDestroy = _vcui_view_keypad_ondestroy, + .priv = NULL, +}; + +static void __vcui_view_keypad_on_keypad_down(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + CALL_UI_DEBUG("source(%s)",source); + + char before_dest[KEYPAD_STR_DEFINE_OPEN_SIZE+KEYPAD_ENTRY_DISP_DATA_SIZE+1] = { 0, }; + char *sub_buffer_pointer = NULL; + char entry_dest[KEYPAD_ENTRY_SET_DATA_SIZE+1] = { 0, }; + char *keypad_source; + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_view_keypad_priv_t *priv = NULL; + + if (NULL == vd) { + CALL_UI_DEBUG("\n data is null \n"); + return; + } + priv = (vcui_view_keypad_priv_t *)vd->priv; + + if (strlen(source) >= KEYPAD_ENTRY_DISP_DATA_SIZE) { + CALL_UI_DEBUG("strlen(source) >= DATA_BUF_SIZE(%d)",KEYPAD_ENTRY_DISP_DATA_SIZE); + return; + } + + if (strcmp(source, "star") == 0) { + keypad_source = "*"; + } else if (strcmp(source, "sharp") == 0) { + keypad_source = "#"; + } else { + keypad_source = (char *)source; + } + + _vcui_engine_interface_send_dtmf_number(keypad_source[0]); + + if (strlen(priv->entry_disp_data) == KEYPAD_ENTRY_DISP_DATA_SIZE) { + sub_buffer_pointer = &priv->entry_disp_data[1]; + + snprintf(priv->entry_disp_data, sizeof(priv->entry_disp_data), + "%s", sub_buffer_pointer); + CALL_UI_DEBUG("priv->entry_disp_data after change [%s]", priv->entry_disp_data); + } + + priv->entry_disp_data[priv->data_len] = keypad_source[0]; + if(priv->data_len < (KEYPAD_ENTRY_DISP_DATA_SIZE-1)) { + priv->data_len++; + } + + snprintf(before_dest, sizeof(before_dest), + "%s", + MAX_DIAL_NUMBER_FONT_SIZE, priv->entry_disp_data); + + snprintf(entry_dest, sizeof(entry_dest), + "%s", + before_dest); + + CALL_UI_DEBUG("entry_dest [%s]", priv->entry_disp_data); + elm_entry_entry_set(priv->entry, entry_dest); + elm_entry_cursor_end_set(priv->entry); +} + +static void __vcui_view_keypad_hide_btn_effect_done(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + CALL_UI_DEBUG(".."); + + _vcui_view_auto_change(); +} + +static void __vcui_view_keypad_hide_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_view_keypad_priv_t *priv = (vcui_view_keypad_priv_t *)vd->priv; + + edje_object_signal_emit(_EDJ(priv->contents), "HIDE", "KEYPADBTN"); + edje_object_signal_callback_add(_EDJ(priv->contents), "DONE", "HIDEKEYPAD", __vcui_view_keypad_hide_btn_effect_done, data); +} + +static void __vcui_view_keypad_end_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + + if (_vcui_doc_get_count_unhold() == 1) { + _vcui_engine_end_call(); + } else if (_vcui_doc_get_count_unhold() > 1) { + _vcui_engine_end_active_calls(); + } else if (_vcui_doc_get_count_hold() == 1) { + _vcui_engine_end_call(); + } else if (_vcui_doc_get_count_hold() > 1) { + _vcui_engine_end_held_calls(); + } else { + CALL_UI_DEBUG("call data is null"); + return; + } + +} + +voice_call_view_data_t *_vcui_view_keypad_new(vcui_app_call_data_t *ad) +{ + + s_view.app_data = ad; + s_view.priv = calloc(1, sizeof(vcui_view_keypad_priv_t)); + + if (!s_view.priv) { + CALL_UI_DEBUG("ERROR!!!!!!!!!!!"); + } + + return &s_view; +} + +static Evas_Object *__vcui_view_keypad_create_hide_button(void *data) +{ + Evas_Object *btn; + Evas_Object *layout; + Evas_Object *sw; + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_view_keypad_priv_t *priv = (vcui_view_keypad_priv_t *)vd->priv; + layout = priv->contents; + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_hide"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_hide", btn); + elm_object_style_set(btn, "text_only/style_keypad_hide_button"); + elm_object_text_set(btn, _("IDS_CALL_BUTTON2_HIDE_KEYPAD")); + evas_object_smart_callback_add(btn, "clicked", __vcui_view_keypad_hide_btn_cb, vd); + + return layout; +} + +static Evas_Object *__vcui_view_keypad_create_end_call(void *data) +{ + Evas_Object *btn; + Evas_Object *layout; + Evas_Object *sw; + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_view_keypad_priv_t *priv = (vcui_view_keypad_priv_t *)vd->priv; + layout = priv->contents; + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_end"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_end", btn); + elm_object_style_set(btn, "text_only/style_keypad_end_button"); + elm_object_text_set(btn, _("IDS_CALL_SK3_END_CALL")); + evas_object_smart_callback_add(btn, "clicked", __vcui_view_keypad_end_btn_cb, vd); + + return layout; +} + +static Evas_Object *__vcui_view_keypad_create_contents(void *data) +{ + if (data == NULL) { + CALL_UI_DEBUG("ERROR"); + return NULL; + } + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + + Evas_Object *eo; + + /* load edje */ + eo = _vcui_load_edj(vd->app_data->win_main, EDJ_NAME, GRP_KEYPAD); + if (eo == NULL) + return NULL; + + return eo; +} + +static Evas_Object *__vcui_view_keypad_create_layout_main(Evas_Object *parent) +{ + if (parent == NULL) { + CALL_UI_DEBUG("ERROR"); + return NULL; + } + Evas_Object *ly; + + ly = elm_layout_add(parent); + retvm_if(ly == NULL, NULL, "Failed elm_layout_add."); + + elm_layout_theme_set(ly, "standard", "window", "integration"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(parent, ly); + + edje_object_signal_emit(_EDJ(ly), "elm,state,show,indicator", "elm"); + edje_object_signal_emit(_EDJ(ly), "elm,state,show,content", "elm"); + evas_object_show(ly); + + return ly; +} + +static void __vcui_view_keypad_draw_keypad_screen(Evas_Object *eo, void *data) +{ + CALL_UI_DEBUG(".."); + + int valid = 0; + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_view_keypad_priv_t *priv = (vcui_view_keypad_priv_t *)vd->priv; + + _vcui_show_wallpaper_image(priv->contents); + + if (_vcui_doc_get_count_unhold() == 1) { + priv->now_data = _vcui_doc_get_last_status(CALL_UNHOLD); + if (NULL == priv->now_data) { + CALL_UI_DEBUG("priv->now_data is NULL \n"); + return; + } + if (strlen((char *)priv->now_data->call_display) == 0) { + edje_object_part_text_set(_EDJ(priv->contents), "txt_call_name", (char *)priv->now_data->call_num); + } else { + edje_object_part_text_set(_EDJ(priv->contents), "txt_call_name", (char *)priv->now_data->call_display); + } + } else if (_vcui_doc_get_count_unhold() > 1) { + priv->now_data = _vcui_doc_get_last_status(CALL_UNHOLD); + edje_object_part_text_set(_EDJ(priv->contents), "txt_call_name", _("IDS_CALL_OPT_CONFERENCE_CALL")); + } else if (_vcui_doc_get_count_hold() == 1) { + priv->now_data = _vcui_doc_get_last_status(CALL_HOLD); + if (NULL == priv->now_data) { + CALL_UI_DEBUG("priv->now_data is NULL \n"); + return; + } + + if (strlen((char *)priv->now_data->call_display) == 0) { + edje_object_part_text_set(_EDJ(priv->contents), "txt_call_name", (char *)priv->now_data->call_num); + } else { + edje_object_part_text_set(_EDJ(priv->contents), "txt_call_name", (char *)priv->now_data->call_display); + } + } else if (_vcui_doc_get_count_hold() > 1) { + priv->now_data = _vcui_doc_get_last_status(CALL_HOLD); + edje_object_part_text_set(_EDJ(priv->contents), "txt_call_name", _("IDS_CALL_OPT_CONFERENCE_CALL")); + } else { + CALL_UI_DEBUG("call data is null"); + return; + } + + valid = _vcui_check_valid_eo(priv->contents, "KEYPADVIEW"); + if (valid == -1) { + CALL_UI_DEBUG("[========== KEYPADVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + return; + } + + if (NULL == priv->now_data) { + CALL_UI_DEBUG("\n priv->now_data is NULL \n"); + return; + } + _vcui_view_common_set_each_time(priv->now_data->start_time); + + __vcui_view_keypad_create_hide_button(vd); + __vcui_view_keypad_create_end_call(vd); + + edje_object_signal_emit(_EDJ(priv->contents), "SHOW", "KEYPADBTN"); + + evas_object_show(priv->contents); + +} + +static int _vcui_view_keypad_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3) +{ + CALL_UI_DEBUG("keypad view create!!"); + + vcui_app_call_data_t *ad = view_data->app_data; + vcui_view_keypad_priv_t *priv = view_data->priv; + + if (!view_data->layout) { + /* Create Main Layout */ + view_data->layout = __vcui_view_keypad_create_layout_main(ad->win_main); + if (view_data->layout == NULL) { + CALL_UI_DEBUG("ERROR"); + return VC_ERROR; + } + + /* Create Contents */ + priv->contents = __vcui_view_keypad_create_contents(view_data); + elm_object_part_content_set(view_data->layout, "elm.swallow.content", priv->contents); + + priv->entry = __vcui_view_keypad_create_single_line_scrolled_entry(priv->contents); + memset(priv->entry_disp_data, 0x0, sizeof(priv->entry_disp_data)); + priv->data_len = 0; + + edje_object_signal_callback_add(_EDJ(priv->contents), + "pad_down", "*", + __vcui_view_keypad_on_keypad_down, + view_data); + + edje_object_part_swallow(_EDJ(priv->contents), "textblock/textarea", priv->entry); + evas_object_name_set(priv->contents, "KEYPADVIEW"); + CALL_UI_DEBUG("[========== KEYPADVIEW: priv->contents Addr : [%p] ==========]", priv->contents); + } + + _vcui_view_keypad_onshow(view_data); + return VC_NO_ERROR; +} + +static int _vcui_view_keypad_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2) +{ + CALL_UI_DEBUG("keypad view update!!"); + + _vcui_view_keypad_onshow(view_data); + return VC_NO_ERROR; +} + +static int _vcui_view_keypad_onhide(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("keypad view hide!!"); + int valid = 0; + vcui_view_keypad_priv_t *priv = (vcui_view_keypad_priv_t *)view_data->priv; + + valid = _vcui_check_valid_eo(priv->contents, "KEYPADVIEW"); + if (valid == -1) { + CALL_UI_DEBUG("[========== KEYPADVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + } + + evas_object_hide(view_data->layout); + return VC_NO_ERROR; +} + +static int _vcui_view_keypad_onshow(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("keypad view show!!"); + + vcui_view_keypad_priv_t *priv = view_data->priv; + + __vcui_view_keypad_draw_keypad_screen(priv->contents, view_data); + + evas_object_hide(view_data->layout); + evas_object_show(view_data->layout); + elm_object_focus_set(priv->entry, EINA_TRUE); + return VC_NO_ERROR; +} + +static int _vcui_view_keypad_ondestroy(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("keypad view destroy!!"); + + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + voice_call_view_data_t *vd = ad->view_st[VIEW_INCALL_KEYPAD_VIEW]; + vcui_view_keypad_priv_t *priv = (vcui_view_keypad_priv_t *)vd->priv; + + if (priv != NULL) { + if (priv->contents) { + evas_object_del(priv->contents); + priv->contents = NULL; + } + + free(priv); + priv = NULL; + } + + if (vd->layout != NULL) { + evas_object_hide(vd->layout); + evas_object_del(vd->layout); + vd->layout = NULL; + } + + ad->view_st[VIEW_INCALL_KEYPAD_VIEW] = NULL; + + _vcui_cache_flush(); + + return VC_NO_ERROR; +} + +static Evas_Object *__vcui_view_keypad_create_single_line_scrolled_entry(void *content) +{ + Evas_Object *en; + + if (content == NULL) { + CALL_UI_DEBUG("content is NULL!"); + return NULL; + } + + en = elm_entry_add(content); + elm_entry_scrollable_set(en, EINA_TRUE); + + elm_entry_select_all(en); + elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF, + ELM_SCROLLER_POLICY_AUTO); + + elm_entry_bounce_set(en, EINA_FALSE, EINA_FALSE); + elm_entry_line_wrap_set(en, ELM_WRAP_WORD); + elm_entry_input_panel_enabled_set(en, EINA_FALSE); + elm_entry_single_line_set(en, EINA_TRUE); + elm_entry_cursor_end_set(en); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + + evas_object_show(en); + + return en; +} diff --git a/ui/vcui-view-keypad.h b/ui/vcui-view-keypad.h new file mode 100755 index 0000000..7cc4f03 --- /dev/null +++ b/ui/vcui-view-keypad.h @@ -0,0 +1,46 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_VIEW_KEYPAD_ +#define _VCUI_VIEW_KEYPAD_ + +#ifndef STRLEN +#define STRLEN(str) (((str) == NULL) ? 0: strlen(str)) +#endif + +#define CURSOR_BEGIN -1 +#define CURSOR_END -2 + +#define MAX_DIAL_NUMBER_FONT_SIZE 70 +#define KEYPAD_STR_DEFINE_OPEN_SIZE 73 +#define KEYPAD_STR_DEFINE_CLOSE_SIZE 43 +#define KEYPAD_ENTRY_DISP_DATA_SIZE 1024 +#define KEYPAD_ENTRY_SET_DATA_SIZE (KEYPAD_STR_DEFINE_OPEN_SIZE + KEYPAD_STR_DEFINE_CLOSE_SIZE + KEYPAD_ENTRY_DISP_DATA_SIZE) + +typedef struct { + Evas_Object *contents; + Evas_Object *ic; + call_data_t *now_data; + + Evas_Object *entry; + int data_len; + char entry_disp_data[KEYPAD_ENTRY_DISP_DATA_SIZE+1]; +} vcui_view_keypad_priv_t; + +#endif + +voice_call_view_data_t *_vcui_view_keypad_new(vcui_app_call_data_t *ad); diff --git a/ui/vcui-view-layout-hd.h b/ui/vcui-view-layout-hd.h new file mode 100755 index 0000000..557ddf0 --- /dev/null +++ b/ui/vcui-view-layout-hd.h @@ -0,0 +1,754 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VCUI_VIEW_LAYOUT_HD__ +#define __VCUI_VIEW_LAYOUT_HD__ + +#define COLOR_DEFAULT 0 0 0 255 +#define COLOR_BG_ALPHA 0 0 0 0 +#define COLOR_BG_FOR_HELD_CALL_DIM 0 0 0 150 + +/*#define BTN_EDGE_W 9*/ + +/* + * HD GUI Widget Dimensions + * In Portrait mode + */ +#define MAIN_SCREEN_W 720 +#define MAIN_SCREEN_H 1280 + +#define INDICATOR_HEIGHT 50 +#define NAVIFRAME_TITLE_HEIGHT 100 + +#define MAIN_NAVIFRAME_W MAIN_SCREEN_W +#define MAIN_NAVIFRAME_H (MAIN_SCREEN_H-INDICATOR_HEIGHT-NAVIFRAME_TITLE_HEIGHT) +#define NAVIFRAME_T_PAD 50 + +#define QP_WIN_W MAIN_SCREEN_W +#define QP_WIN_H 166 /*approx*/ + +#define DIALING_STATUS_L_PAD 0 +#define DIALING_STATUS_WIDTH MAIN_SCREEN_W +#define DIALING_STATUS_T_PAD 687 +#define DIALING_STATUS_HEIGHT 52 + +#define CALL_NAME_L_PAD 20 +#define CALL_NAME_WIDTH 680 +#define CALL_NAME_T_PAD 83 +#define CALL_NAME_HEIGHT 80 + +#define CALL_NUMBER_T_GAP 6 + +#define CALL_NUMBER_L_PAD CALL_NAME_L_PAD +#define CALL_NUMBER_WIDTH CALL_NAME_WIDTH +#define CALL_NUMBER_T_PAD (CALL_NAME_T_PAD+CALL_NAME_HEIGHT+CALL_NUMBER_T_GAP) +#define CALL_NUMBER_HEIGHT 52 + +#define CALLER_ID_L_PAD 208 +#define CALLER_ID_WIDTH 304 +#define CALLER_ID_T_PAD 268 +#define CALLER_ID_HEIGHT 304 + +#define BACKGROUND_CID_L_PAD 0 +#define BACKGROUND_CID_WIDTH MAIN_SCREEN_W +#define BACKGROUND_CID_T_PAD 0 +#define BACKGROUND_CID_HEIGHT MAIN_SCREEN_H + +#define MT_CALLING_NAME_BG_WIDTH MAIN_SCREEN_W +#define MT_CALLING_NAME_BG_HEIGHT 590 + +#define ACCEPT_BTN_L_PAD 40 +#define ACCEPT_BTN_WIDTH 300 +#define ACCEPT_BTN_T_PAD 992 +#define ACCEPT_BTN_HEIGHT 112 + +#define REJECT_BTN_L_GAP 40 + +#define REJECT_BTN_L_PAD (ACCEPT_BTN_L_PAD+ACCEPT_BTN_WIDTH+REJECT_BTN_L_GAP) +#define REJECT_BTN_WIDTH ACCEPT_BTN_WIDTH +#define REJECT_BTN_T_PAD ACCEPT_BTN_T_PAD +#define REJECT_BTN_HEIGHT ACCEPT_BTN_HEIGHT + +#define REJECT_W_MSG_BTN_T_GAP 40 + +#define REJECT_W_MSG_BTN_L_PAD ACCEPT_BTN_L_PAD +#define REJECT_W_MSG_BTN_WIDTH 640 +#define REJECT_W_MSG_BTN_T_PAD (ACCEPT_BTN_T_PAD+ACCEPT_BTN_HEIGHT+REJECT_W_MSG_BTN_T_GAP) +#define REJECT_W_MSG_BTN_HEIGHT 90 + +#define INCALL_HOLD_BTN_L_PAD 40 +#define INCALL_HOLD_BTN_WIDTH 108 /*approx*/ +#define INCALL_HOLD_BTN_T_PAD 670 /*approx*/ +#define INCALL_HOLD_BTN_HEIGHT 86 /*approx*/ + +#define INCALL_TIMER_L_PAD 40 +#define INCALL_TIMER_WIDTH 640 +#define INCALL_TIMER_T_PAD 687 +#define INCALL_TIMER_HEIGHT 52 + +#define INCALL_SHARE_BG_T_PAD 584 /*approx*/ +#define INCALL_SHARE_BG_HEIGHT 654 /*approx*/ + +#define KEYPAD_TIMER_L_PAD 40 +#define KEYPAD_TIMER_WIDTH 640 +#define KEYPAD_TIMER_T_PAD 384 +#define KEYPAD_TIMER_HEIGHT 52 + +#define KEYPAD_ENTRY_TXT_L_PAD KEYPAD_TIMER_L_PAD +#define KEYPAD_ENTRY_TXT_WIDTH KEYPAD_TIMER_WIDTH +#define KEYPAD_ENTRY_TXT_T_PAD 90 +#define KEYPAD_ENTRY_TXT_HEIGHT 114 + +#define KEYPAD_BTNS_T_PAD 461 +#define KEYPAD_BTNS_WIDTH MAIN_SCREEN_W +#define KEYPAD_BTNS_HEIGHT 620 + +#define KEYPAD_HIDE_BTN_L_PAD KEYPAD_TIMER_L_PAD +#define KEYPAD_HIDE_BTN_WIDTH 300 +#define KEYPAD_HIDE_BTN_T_PAD 1140 +#define KEYPAD_HIDE_BTN_HEIGHT 112 + +#define KEYPAD_BTN_GAP 40 +#define KEYPAD_END_BTN_L_PAD (KEYPAD_HIDE_BTN_L_PAD+KEYPAD_HIDE_BTN_WIDTH+KEYPAD_BTN_GAP) +#define KEYPAD_END_BTN_WIDTH KEYPAD_HIDE_BTN_WIDTH + +#define SPLIT_CID1_L_PAD 56 +#define SPLIT_CID1_WIDTH 304 +#define SPLIT_CID1_T_PAD 219 +#define SPLIT_CID1_HEIGHT 304 + +#define SPLIT_PAUSE_L_PAD (SPLIT_CID1_L_PAD+8) +#define SPLIT_PAUSE_WIDTH 62 +#define SPLIT_PAUSE_HEIGHT 62 +#define SPLIT_PAUSE_T_PAD (SPLIT_CID1_T_PAD+SPLIT_CID1_HEIGHT-8-SPLIT_PAUSE_HEIGHT) + +#define SPLIT_CID2_L_PAD 456 +#define SPLIT_CID2_WIDTH 208 +#define SPLIT_CID2_T_PAD 267 +#define SPLIT_CID2_HEIGHT 208 + +#define SPLIT_PLAY_L_PAD (SPLIT_CID2_L_PAD+12) +#define SPLIT_PLAY_WIDTH 40 +#define SPLIT_PLAY_HEIGHT 40 +#define SPLIT_PLAY_T_PAD (SPLIT_CID2_T_PAD+SPLIT_CID2_HEIGHT-8-SPLIT_PLAY_HEIGHT) + +#define SPLIT_NAME1_L_PAD 38 +#define SPLIT_NAME1_WIDTH 364 +#define SPLIT_NAME1_T_PAD 145 +#define SPLIT_NAME1_HEIGHT 58 + +#define SPLIT_NAME2_L_PAD (SPLIT_NAME1_L_PAD+SPLIT_NAME1_WIDTH+22) +#define SPLIT_NAME2_WIDTH 258 +#define SPLIT_NAME2_T_PAD 217 +#define SPLIT_NAME2_HEIGHT 40 + +#define SPLIT_TIMER_TXT_T_PAD 549 +#define SPLIT_TIMER_TXT_HEIGHT 46 + +#define SPLIT_MORE_BTN_WIDTH 40 +#define SPLIT_MORE_BTN_L_PAD (SPLIT_CID2_L_PAD+SPLIT_CID2_WIDTH-SPLIT_MORE_BTN_WIDTH) +#define SPLIT_ONHOLD_TXT_W_ICON_WIDTH (SPLIT_CID2_WIDTH-SPLIT_MORE_BTN_WIDTH) +#define SPLIT_ONHOLD_TXT_T_PAD 492 +#define SPLIT_ONHOLD_TXT_HEIGHT 40 + +#define SPLIT_SWAP_CID1_L_PAD 70 +#define SPLIT_SWAP_CID1_WIDTH 208 + +#define SPLIT_SWAP_PLAY_L_PAD (SPLIT_SWAP_CID1_L_PAD+12) +#define SPLIT_SWAP_PLAY_WIDTH 40 + +#define SPLIT_SWAP_CID2_L_PAD 336 +#define SPLIT_SWAP_CID2_WIDTH 304 + +#define SPLIT_SWAP_PAUSE_L_PAD (SPLIT_SWAP_CID2_L_PAD+8) +#define SPLIT_SWAP_PAUSE_WIDTH 62 + +#define SPLIT_SWAP_NAME1_L_PAD 38 +#define SPLIT_SWAP_NAME1_WIDTH 258 + +#define SPLIT_SWAP_NAME2_L_PAD (SPLIT_SWAP_NAME1_L_PAD+SPLIT_SWAP_NAME1_WIDTH+22) +#define SPLIT_SWAP_NAME2_WIDTH 364 + +#define SPLIT_SWAP_MORE_BTN_WIDTH 60 +#define SPLIT_SWAP_MORE_BTN_L_PAD (SPLIT_SWAP_CID2_L_PAD+SPLIT_SWAP_CID2_WIDTH-SPLIT_SWAP_MORE_BTN_WIDTH) +#define SPLIT_SWAP_MORE_BTN_T_PAD (SPLIT_TIMER_TXT_T_PAD-7) +#define SPLIT_SWAP_MORE_BTN_HEIGHT 60 +#define SPLIT_TIMER_TXT_W_ICON_WIDTH (SPLIT_SWAP_CID2_WIDTH-SPLIT_SWAP_MORE_BTN_WIDTH) + +#define CONF_LIST_T_PAD 182 +#define CONF_LIST_HEIGHT 566 + +#define CONF_HOLD_WIDTH 110 +#define CONF_HOLD_L_PAD (MAIN_SCREEN_W-40-CONF_HOLD_WIDTH) +#define CONF_HOLD_T_PAD 866 +#define CONF_HOLD_HEIGHT 76 + +#define CONF_TIMER_T_PAD 878 +#define CONF_TIMER_HEIGHT 52 + +#define CONF_CALL_BIG_END_T_PAD 1026 + +#define REJ_MSG_NEW_BTN_L_PAD 40 /*approx*/ +#define REJ_MSG_NEW_BTN_WIDTH 640 /*approx*/ +#define REJ_MSG_NEW_BTN_T_PAD 120 /*approx*/ +#define REJ_MSG_NEW_BTN_HEIGHT 128 /*approx*/ + +#define REJ_MSG_LIST_T_PAD 32 /*approx*/ +#define REJ_MSG_LIST_HEIGHT 1096 /*approx*/ + +#define SIX_BTN_COL1_L_PAD 40 +#define SIX_BTN_COL1_WIDTH 200 +#define SIX_BTN_COL2_L_PAD (SIX_BTN_COL1_L_PAD+SIX_BTN_COL1_WIDTH+20) +#define SIX_BTN_COL3_L_PAD (SIX_BTN_COL2_L_PAD+SIX_BTN_COL1_WIDTH+20) +#define SIX_BTN_ROW1_T_PAD 792 +#define SIX_BTN_ROW1_HEIGHT 140 +#define SIX_BTN_ROW2_T_PAD (SIX_BTN_ROW1_T_PAD+SIX_BTN_ROW1_HEIGHT+20) + +#define CALL_BIG_END_L_PAD 40 +#define CALL_BIG_END_WIDTH 640 +#define CALL_BIG_END_T_PAD 1140 +#define CALL_BIG_END_HEIGHT 112 + +#define INCMG_CALL_BTN1_T_PAD 700 +#define INCMG_CALL_BTN_HEIGHT CALL_BIG_END_HEIGHT +#define INCMG_CALL_BTN2_T_PAD 838 +#define INCMG_CALL_BTN3_T_PAD 976 + +#define VIDEO_BTN_POS1_L_PAD 40 +#define VIDEO_BTN_POS1_WIDTH 300 +#define VIDEO_BTN_POS1_T_PAD 864 +#define VIDEO_BTN_POS1_HEIGHT 112 +#define VIDEO_BTN_POS2_L_PAD VIDEO_BTN_POS1_L_PAD +#define VIDEO_BTN_POS2_WIDTH VIDEO_BTN_POS1_WIDTH +#define VIDEO_BTN_POS2_T_PAD 1002 +#define VIDEO_BTN_POS2_HEIGHT VIDEO_BTN_POS1_HEIGHT + +#define VOICE_BTN_POS1_L_PAD (VIDEO_BTN_POS1_L_PAD+VIDEO_BTN_POS1_WIDTH+40) +#define VOICE_BTN_POS1_WIDTH VIDEO_BTN_POS1_WIDTH + +#define MSG_BTN_POS1_L_PAD VIDEO_BTN_POS1_L_PAD +#define MSG_BTN_POS1_WIDTH 640 +#define MSG_BTN_POS1_T_PAD 1002 +#define MSG_BTN_POS1_HEIGHT VIDEO_BTN_POS1_HEIGHT +#define MSG_BTN_POS2_T_PAD 1140 +#define MSG_BTN_POS2_HEIGHT VIDEO_BTN_POS1_HEIGHT + +#define CONTACT_BTN_POS1_L_PAD VIDEO_BTN_POS1_L_PAD +#define CONTACT_BTN_POS1_WIDTH MSG_BTN_POS1_WIDTH +#define CONTACT_BTN_POS1_T_PAD 1140 +#define CONTACT_BTN_POS1_HEIGHT VIDEO_BTN_POS1_HEIGHT + +#define QP_CID_L_PAD 15 /*approx*/ +#define QP_CID_WIDTH 123 /*approx*/ +#define QP_CID_T_PAD 18 /*approx*/ +#define QP_CID_HEIGHT 130 /*approx*/ + +#define QP_END_BTN_L_PAD 153 /*approx*/ +#define QP_END_BTN_WIDTH 552 /*approx*/ +#define QP_END_BTN_T_PAD 80 /*approx*/ +#define QP_END_BTN_HEIGHT 64 /*approx*/ + +#define QP_NAME_L_PAD 153 /*approx*/ +#define QP_NAME_WIDTH 372 /*approx*/ +#define QP_NAME_T_PAD 13 /*approx*/ +#define QP_NAME_HEIGHT 48 /*approx*/ + +#define QP_TIMER_L_PAD 555 /*approx*/ +/* + * End of HD GUI Widget Dimensions + */ + + +/* + * Relative positions + * In Portrait mode + */ +/* Relative X & Y positions of widgets w.r.t. Full Screen */ +#define REL_W(x) ((x)/MAIN_SCREEN_W) +#define REL_H(y) ((y)/MAIN_SCREEN_H) + +/* Relative X & Y positions of widgets w.r.t. Navi-frame layout */ +/*#define WL_NB_H 94*/ +#define REL_NAVIFRAME_W(x) ((x)/MAIN_NAVIFRAME_W) +#define REL_NAVIFRAME_H(y) ((y)/MAIN_NAVIFRAME_H) + +/* Relative X & Y positions of widgets w.r.t. ACC/REJ ICON layout */ +#define REL_LOCK_W(x) ((x)/483) /*approx*/ +#define REL_LOCK_H(y) ((y)/198) /*approx*/ +/* Relative X & Y positions of widgets w.r.t. REJ-W-MSG ICON layout */ +#define REL_LOCK_MSG_W(x) ((x)/348) /*approx*/ +#define REL_LOCK_MSG_H(y) ((y)/200) /*approx*/ + +/* Relative X & Y positions of widgets w.r.t. Keypad Buttons layout */ +#define REL_KEYPAD_W(x) ((x)/KEYPAD_BTNS_WIDTH) +#define REL_KEYPAD_H(y) ((y)/KEYPAD_BTNS_HEIGHT) +/* + * End of Relative positions + */ + + +/* + * MO/Dialing view & MT/Incoming view + * In Portrait mode + */ +#define DIALLING_STATUS_L REL_W(DIALING_STATUS_L_PAD) +#define DIALLING_STATUS_R REL_W(DIALING_STATUS_L_PAD+DIALING_STATUS_WIDTH) +#define DIALLING_STATUS_T REL_H(DIALING_STATUS_T_PAD) +#define DIALLING_STATUS_B REL_H(DIALING_STATUS_T_PAD+DIALING_STATUS_HEIGHT) + +/* +#define DIALLING_MT_STATUS_L REL_W(123) +#define DIALLING_MT_STATUS_R REL_W(357) +#define DIALLING_MT_STATUS_T REL_H(375) +#define DIALLING_MT_STATUS_B REL_H(407) +*/ + +#define DIALLING_NAME_L REL_W(CALL_NAME_L_PAD) +#define DIALLING_NAME_R REL_W(CALL_NAME_L_PAD+CALL_NAME_WIDTH) +#define DIALLING_NAME_T REL_H(CALL_NAME_T_PAD) +#define DIALLING_NAME_B REL_H(CALL_NAME_T_PAD+CALL_NAME_HEIGHT) + +#define DIALLING_NUMBER_L REL_W(CALL_NUMBER_L_PAD) +#define DIALLING_NUMBER_R REL_W(CALL_NUMBER_L_PAD+CALL_NUMBER_WIDTH) +#define DIALLING_NUMBER_T REL_H(CALL_NUMBER_T_PAD) +#define DIALLING_NUMBER_B REL_H(CALL_NUMBER_T_PAD+CALL_NUMBER_HEIGHT) + +#define DIALLING_CID_L REL_W(CALLER_ID_L_PAD) +#define DIALLING_CID_R REL_W(CALLER_ID_L_PAD+CALLER_ID_WIDTH) +#define DIALLING_CID_T REL_H(CALLER_ID_T_PAD) +#define DIALLING_CID_B REL_H(CALLER_ID_T_PAD+CALLER_ID_HEIGHT) + +#define DIALLING_BACKGROUND_CID_L REL_W(BACKGROUND_CID_L_PAD) +#define DIALLING_BACKGROUND_CID_R REL_W(BACKGROUND_CID_L_PAD+BACKGROUND_CID_WIDTH) +#define DIALLING_BACKGROUND_CID_T REL_H(BACKGROUND_CID_T_PAD) +#define DIALLING_BACKGROUND_CID_B REL_H(BACKGROUND_CID_T_PAD+BACKGROUND_CID_HEIGHT) + +#define MT_CALLING_BG_L REL_W(0) +#define MT_CALLING_BG_R REL_W(0+MT_CALLING_NAME_BG_WIDTH) +#define MT_CALLING_BG_T REL_H(0) +#define MT_CALLING_BG_B REL_H(0+MT_CALLING_NAME_BG_HEIGHT) + +/* accept - MT view */ +#define DIALLING_MT_BTN1_L REL_W(ACCEPT_BTN_L_PAD) +#define DIALLING_MT_BTN1_R REL_W(ACCEPT_BTN_L_PAD+ACCEPT_BTN_WIDTH) +#define DIALLING_MT_BTN1_T REL_H(ACCEPT_BTN_T_PAD) +#define DIALLING_MT_BTN1_B REL_H(ACCEPT_BTN_T_PAD+ACCEPT_BTN_HEIGHT) + +/* reject - MT view */ +#define DIALLING_MT_BTN2_L REL_W(REJECT_BTN_L_PAD) +#define DIALLING_MT_BTN2_R REL_W(REJECT_BTN_L_PAD+REJECT_BTN_WIDTH) +#define DIALLING_MT_BTN2_T REL_H(REJECT_BTN_T_PAD) +#define DIALLING_MT_BTN2_B REL_H(REJECT_BTN_T_PAD+REJECT_BTN_HEIGHT) +/* + * End of MO/Dialing view & MT/Incoming view + */ + + +/* + * MT LOCK View - check + * In Portrait mode + */ +#define INCOMING_LOCK_ACCEPT_BG_L REL_W(-273) +#define INCOMING_LOCK_ACCEPT_BG_R REL_W(210) +#define INCOMING_LOCK_ACCEPT_BG_T REL_H(945) +#define INCOMING_LOCK_ACCEPT_BG_B REL_H(1144) + +#define INCOMING_LOCK_ACCEPT_ICON_L REL_LOCK_W(303) +#define INCOMING_LOCK_ACCEPT_ICON_R REL_LOCK_W(408) +#define INCOMING_LOCK_ACCEPT_ICON_T REL_LOCK_H(37) +#define INCOMING_LOCK_ACCEPT_ICON_B REL_LOCK_H(149) + +#define INCOMING_LOCK_ACCEPT_TEXT_L REL_LOCK_W(45) +#define INCOMING_LOCK_ACCEPT_TEXT_R REL_LOCK_W(273) +#define INCOMING_LOCK_ACCEPT_TEXT_T INCOMING_LOCK_ACCEPT_ICON_T +#define INCOMING_LOCK_ACCEPT_TEXT_B INCOMING_LOCK_ACCEPT_ICON_B + +#define INCOMING_LOCK_REJECT_BG_L REL_W(510) +#define INCOMING_LOCK_REJECT_BG_R REL_W(993) +#define INCOMING_LOCK_REJECT_BG_T INCOMING_LOCK_ACCEPT_BG_T +#define INCOMING_LOCK_REJECT_BG_B INCOMING_LOCK_ACCEPT_BG_B + +#define INCOMING_LOCK_REJECT_ICON_L REL_LOCK_W(75) +#define INCOMING_LOCK_REJECT_ICON_R REL_LOCK_W(180) +#define INCOMING_LOCK_REJECT_ICON_T INCOMING_LOCK_ACCEPT_ICON_T +#define INCOMING_LOCK_REJECT_ICON_B INCOMING_LOCK_ACCEPT_ICON_B + +#define INCOMING_LOCK_REJECT_TEXT_L REL_LOCK_W(195) +#define INCOMING_LOCK_REJECT_TEXT_R REL_LOCK_W(423) +#define INCOMING_LOCK_REJECT_TEXT_T INCOMING_LOCK_REJECT_ICON_T +#define INCOMING_LOCK_REJECT_TEXT_B INCOMING_LOCK_REJECT_ICON_B +/* + * End of MT LOCK View + */ + + +/* + * KEYPAD View + * In Portrait mode + */ +#define INCALL_DIALER_TIMER_L REL_W(KEYPAD_TIMER_L_PAD) +#define INCALL_DIALER_TIMER_R REL_W(KEYPAD_TIMER_L_PAD+KEYPAD_TIMER_WIDTH) +#define INCALL_DIALER_TIMER_T REL_H(KEYPAD_TIMER_T_PAD) +#define INCALL_DIALER_TIMER_B REL_H(KEYPAD_TIMER_T_PAD+KEYPAD_TIMER_HEIGHT) + +#define INCALL_DIALER_NAME_L INCALL_DIALER_TIMER_L +#define INCALL_DIALER_NAME_R INCALL_DIALER_TIMER_R +#define INCALL_DIALER_NAME_T INCALL_DIALER_TIMER_T +#define INCALL_DIALER_NAME_B INCALL_DIALER_TIMER_B + +/* +#define DIALLING_KEYPAD_T_BF REL_H(319) +#define DIALLING_KEYPAD_B_BF REL_H(710) +*/ + +#define DIALLING_KEYPAD_L REL_W(0) +#define DIALLING_KEYPAD_R REL_W(MAIN_SCREEN_W) +#define DIALLING_KEYPAD_T REL_H(KEYPAD_BTNS_T_PAD) +#define DIALLING_KEYPAD_B REL_H(KEYPAD_BTNS_T_PAD+KEYPAD_BTNS_HEIGHT) + +#define DIALLING_ENTRY_TEXT_L REL_W(KEYPAD_ENTRY_TXT_L_PAD) +#define DIALLING_ENTRY_TEXT_R REL_W(KEYPAD_ENTRY_TXT_L_PAD+KEYPAD_ENTRY_TXT_WIDTH) +#define DIALLING_ENTRY_TEXT_T REL_H(KEYPAD_ENTRY_TXT_T_PAD) +#define DIALLING_ENTRY_TEXT_B REL_H(KEYPAD_ENTRY_TXT_T_PAD+KEYPAD_ENTRY_TXT_HEIGHT) + +#define DIALER_BTN1_L REL_W(KEYPAD_HIDE_BTN_L_PAD) +#define DIALER_BTN1_R REL_W(KEYPAD_HIDE_BTN_L_PAD+KEYPAD_HIDE_BTN_WIDTH) +#define DIALER_BTN1_T REL_H(KEYPAD_HIDE_BTN_T_PAD) +#define DIALER_BTN1_B REL_H(KEYPAD_HIDE_BTN_T_PAD+KEYPAD_HIDE_BTN_HEIGHT) + +#define DIALER_BTN2_L REL_W(KEYPAD_END_BTN_L_PAD) +#define DIALER_BTN2_R REL_W(KEYPAD_END_BTN_L_PAD+KEYPAD_END_BTN_WIDTH) +#define DIALER_BTN2_T DIALER_BTN1_T +#define DIALER_BTN2_B DIALER_BTN1_B +/* + * End of KEYPAD View + */ + + +/* + * INCALL View + * In Portrait mode + */ +#define INCALL_CID_L DIALLING_CID_L +#define INCALL_CID_R DIALLING_CID_R +#define INCALL_CID_T DIALLING_CID_T +#define INCALL_CID_B DIALLING_CID_B + +/* +#define INCALL_CID_DIM_T DIALLING_CID_T +#define INCALL_CID_DIM_B DIALLING_CID_B +#define INCALL_CID_DIM_L REL_W(145) +#define INCALL_CID_DIM_R REL_W(334) +*/ + +#define INCALL_BACKGROUND_CID_L DIALLING_BACKGROUND_CID_L +#define INCALL_BACKGROUND_CID_R DIALLING_BACKGROUND_CID_R +#define INCALL_BACKGROUND_CID_T DIALLING_BACKGROUND_CID_T +#define INCALL_BACKGROUND_CID_B DIALLING_BACKGROUND_CID_B + +#define INCALL_NAME_L DIALLING_NAME_L +#define INCALL_NAME_R DIALLING_NAME_R +#define INCALL_NAME_T DIALLING_NAME_T +#define INCALL_NAME_B DIALLING_NAME_B + +#define INCALL_NUMBER_L DIALLING_NUMBER_L +#define INCALL_NUMBER_R DIALLING_NUMBER_R +#define INCALL_NUMBER_T DIALLING_NUMBER_T +#define INCALL_NUMBER_B DIALLING_NUMBER_B + +#define INCALL_HOLD_L REL_W(INCALL_HOLD_BTN_L_PAD) +#define INCALL_HOLD_R REL_W(INCALL_HOLD_BTN_L_PAD+INCALL_HOLD_BTN_WIDTH) +#define INCALL_HOLD_T REL_H(INCALL_HOLD_BTN_T_PAD) +#define INCALL_HOLD_B REL_H(INCALL_HOLD_BTN_T_PAD+INCALL_HOLD_BTN_HEIGHT) + +#define INCALL_TIMER_L REL_W(INCALL_TIMER_L_PAD) +#define INCALL_TIMER_R REL_W(INCALL_TIMER_L_PAD+INCALL_TIMER_WIDTH) +#define INCALL_TIMER_T REL_H(INCALL_TIMER_T_PAD) +#define INCALL_TIMER_B REL_H(INCALL_TIMER_T_PAD+INCALL_TIMER_HEIGHT) + +#define INCALL_BACKGROUND_SHARE_L REL_W(0) +#define INCALL_BACKGROUND_SHARE_R REL_W(MAIN_SCREEN_W) +#define INCALL_BACKGROUND_SHARE_T REL_H(INCALL_SHARE_BG_T_PAD) +#define INCALL_BACKGROUND_SHARE_B REL_H(INCALL_SHARE_BG_T_PAD+INCALL_SHARE_BG_HEIGHT) +/* + * End of INCALL View + */ + + +/* + * MULTI-CALL SPLIT View + * In Portrait mode + */ +/* L[ACT] + R[HLD] */ +#define MULTICALL_SPLIT_BACKGROUND_CID_L INCALL_BACKGROUND_CID_L +#define MULTICALL_SPLIT_BACKGROUND_CID_R INCALL_BACKGROUND_CID_R +#define MULTICALL_SPLIT_BACKGROUND_CID_T INCALL_BACKGROUND_CID_T +#define MULTICALL_SPLIT_BACKGROUND_CID_B INCALL_BACKGROUND_CID_B + +#define MULTICALL_SPLIT_CID_1_L REL_W(SPLIT_CID1_L_PAD) +#define MULTICALL_SPLIT_CID_1_R REL_W(SPLIT_CID1_L_PAD+SPLIT_CID1_WIDTH) +#define MULTICALL_SPLIT_CID_1_T REL_H(SPLIT_CID1_T_PAD) +#define MULTICALL_SPLIT_CID_1_B REL_H(SPLIT_CID1_T_PAD+SPLIT_CID1_HEIGHT) + +#define MULTICALL_SPLIT_PAUSE_L REL_W(SPLIT_PAUSE_L_PAD) +#define MULTICALL_SPLIT_PAUSE_R REL_W(SPLIT_PAUSE_L_PAD+SPLIT_PAUSE_WIDTH) +#define MULTICALL_SPLIT_PAUSE_T REL_H(SPLIT_PAUSE_T_PAD) +#define MULTICALL_SPLIT_PAUSE_B REL_H(SPLIT_PAUSE_T_PAD+SPLIT_PAUSE_HEIGHT) + +#define MULTICALL_SPLIT_CID_2_L REL_W(SPLIT_CID2_L_PAD) +#define MULTICALL_SPLIT_CID_2_R REL_W(SPLIT_CID2_L_PAD+SPLIT_CID2_WIDTH) +#define MULTICALL_SPLIT_CID_2_T REL_H(SPLIT_CID2_T_PAD) +#define MULTICALL_SPLIT_CID_2_B REL_H(SPLIT_CID2_T_PAD+SPLIT_CID2_HEIGHT) + +#define MULTICALL_SPLIT_PLAY_L REL_W(SPLIT_PLAY_L_PAD) +#define MULTICALL_SPLIT_PLAY_R REL_W(SPLIT_PLAY_L_PAD+SPLIT_PLAY_WIDTH) +#define MULTICALL_SPLIT_PLAY_T REL_H(SPLIT_PLAY_T_PAD) +#define MULTICALL_SPLIT_PLAY_B REL_H(SPLIT_PLAY_T_PAD+SPLIT_PLAY_HEIGHT) + +#define MULTICALL_SPLIT_NAME_1_L REL_W(SPLIT_NAME1_L_PAD) +#define MULTICALL_SPLIT_NAME_1_R REL_W(SPLIT_NAME1_L_PAD+SPLIT_NAME1_WIDTH) +#define MULTICALL_SPLIT_NAME_1_T REL_H(SPLIT_NAME1_T_PAD) +#define MULTICALL_SPLIT_NAME_1_B REL_H(SPLIT_NAME1_T_PAD+SPLIT_NAME1_HEIGHT) + +#define MULTICALL_SPLIT_NAME_2_L REL_W(SPLIT_NAME2_L_PAD) +#define MULTICALL_SPLIT_NAME_2_R REL_W(SPLIT_NAME2_L_PAD+SPLIT_NAME2_WIDTH) +#define MULTICALL_SPLIT_NAME_2_T REL_H(SPLIT_NAME2_T_PAD) +#define MULTICALL_SPLIT_NAME_2_B REL_H(SPLIT_NAME2_T_PAD+SPLIT_NAME2_HEIGHT) + +#define MULTICALL_SPLIT_TIMER_L MULTICALL_SPLIT_CID_1_L +#define MULTICALL_SPLIT_TIMER_R MULTICALL_SPLIT_CID_1_R +#define MULTICALL_SPLIT_TIMER_T REL_H(SPLIT_TIMER_TXT_T_PAD) +#define MULTICALL_SPLIT_TIMER_B REL_H(SPLIT_TIMER_TXT_T_PAD+SPLIT_TIMER_TXT_HEIGHT) + +#define MULTICALL_SPLIT_ON_HOLD_TXT_L MULTICALL_SPLIT_CID_2_L +#define MULTICALL_SPLIT_ON_HOLD_TXT_R MULTICALL_SPLIT_CID_2_R +#define MULTICALL_SPLIT_ON_HOLD_TXT_T REL_H(SPLIT_ONHOLD_TXT_T_PAD) +#define MULTICALL_SPLIT_ON_HOLD_TXT_B REL_H(SPLIT_ONHOLD_TXT_T_PAD+SPLIT_ONHOLD_TXT_HEIGHT) + +#define MULTICALL_SPLIT_ON_HOLD_TXT_WITH_ICON_L MULTICALL_SPLIT_CID_2_L +#define MULTICALL_SPLIT_ON_HOLD_TXT_WITH_ICON_R REL_W(SPLIT_CID2_L_PAD+SPLIT_CID2_WIDTH-SPLIT_MORE_BTN_WIDTH) +#define MULTICALL_SPLIT_ON_HOLD_TXT_WITH_ICON_T MULTICALL_SPLIT_ON_HOLD_TXT_T +#define MULTICALL_SPLIT_ON_HOLD_TXT_WITH_ICON_B MULTICALL_SPLIT_ON_HOLD_TXT_B + +#define MULTICALL_SPLIT_MORE_ICON_L REL_W(SPLIT_MORE_BTN_L_PAD) +#define MULTICALL_SPLIT_MORE_ICON_R REL_W(SPLIT_MORE_BTN_L_PAD+SPLIT_MORE_BTN_WIDTH) +#define MULTICALL_SPLIT_MORE_ICON_T MULTICALL_SPLIT_ON_HOLD_TXT_T +#define MULTICALL_SPLIT_MORE_ICON_B MULTICALL_SPLIT_ON_HOLD_TXT_B +/* L[ACT] + R[HLD] */ + +/* L[HLD] + R[ACT] */ +#define MULTICALL_SPLIT_SWAP_CID_1_L REL_W(SPLIT_SWAP_CID1_L_PAD) +#define MULTICALL_SPLIT_SWAP_CID_1_R REL_W(SPLIT_SWAP_CID1_L_PAD+SPLIT_SWAP_CID1_WIDTH) +#define MULTICALL_SPLIT_SWAP_CID_1_T MULTICALL_SPLIT_CID_2_T +#define MULTICALL_SPLIT_SWAP_CID_1_B MULTICALL_SPLIT_CID_2_B + +#define MULTICALL_SPLIT_SWAP_PLAY_L REL_W(SPLIT_SWAP_PLAY_L_PAD) +#define MULTICALL_SPLIT_SWAP_PLAY_R REL_W(SPLIT_SWAP_PLAY_L_PAD+SPLIT_SWAP_PLAY_WIDTH) +#define MULTICALL_SPLIT_SWAP_PLAY_T MULTICALL_SPLIT_PLAY_T +#define MULTICALL_SPLIT_SWAP_PLAY_B MULTICALL_SPLIT_PLAY_B + +#define MULTICALL_SPLIT_SWAP_CID_2_L REL_W(SPLIT_SWAP_CID2_L_PAD) +#define MULTICALL_SPLIT_SWAP_CID_2_R REL_W(SPLIT_SWAP_CID2_L_PAD+SPLIT_SWAP_CID2_WIDTH) +#define MULTICALL_SPLIT_SWAP_CID_2_T MULTICALL_SPLIT_CID_1_T +#define MULTICALL_SPLIT_SWAP_CID_2_B MULTICALL_SPLIT_CID_1_B + +#define MULTICALL_SPLIT_SWAP_PAUSE_L REL_W(SPLIT_SWAP_PAUSE_L_PAD) +#define MULTICALL_SPLIT_SWAP_PAUSE_R REL_W(SPLIT_SWAP_PAUSE_L_PAD+SPLIT_SWAP_PAUSE_WIDTH) +#define MULTICALL_SPLIT_SWAP_PAUSE_T MULTICALL_SPLIT_PAUSE_T +#define MULTICALL_SPLIT_SWAP_PAUSE_B MULTICALL_SPLIT_PAUSE_B + +#define MULTICALL_SPLIT_SWAP_NAME_1_L MULTICALL_SPLIT_NAME_1_L +#define MULTICALL_SPLIT_SWAP_NAME_1_R REL_W(SPLIT_SWAP_NAME1_L_PAD+SPLIT_SWAP_NAME1_WIDTH) +#define MULTICALL_SPLIT_SWAP_NAME_1_T MULTICALL_SPLIT_NAME_2_T +#define MULTICALL_SPLIT_SWAP_NAME_1_B MULTICALL_SPLIT_NAME_2_B + +#define MULTICALL_SPLIT_SWAP_NAME_2_L REL_W(SPLIT_SWAP_NAME2_L_PAD) +#define MULTICALL_SPLIT_SWAP_NAME_2_R REL_W(SPLIT_SWAP_NAME2_L_PAD+SPLIT_SWAP_NAME2_WIDTH) +#define MULTICALL_SPLIT_SWAP_NAME_2_T MULTICALL_SPLIT_NAME_1_T +#define MULTICALL_SPLIT_SWAP_NAME_2_B MULTICALL_SPLIT_NAME_1_B + +#define MULTICALL_SPLIT_SWAP_ON_HOLD_TXT_L MULTICALL_SPLIT_SWAP_CID_1_L +#define MULTICALL_SPLIT_SWAP_ON_HOLD_TXT_R MULTICALL_SPLIT_SWAP_CID_1_R +#define MULTICALL_SPLIT_SWAP_ON_HOLD_TXT_T MULTICALL_SPLIT_ON_HOLD_TXT_T +#define MULTICALL_SPLIT_SWAP_ON_HOLD_TXT_B MULTICALL_SPLIT_ON_HOLD_TXT_B + +#define MULTICALL_SPLIT_SWAP_TIMER_L MULTICALL_SPLIT_SWAP_CID_2_L +#define MULTICALL_SPLIT_SWAP_TIMER_R MULTICALL_SPLIT_SWAP_CID_2_R +#define MULTICALL_SPLIT_SWAP_TIMER_T MULTICALL_SPLIT_TIMER_T +#define MULTICALL_SPLIT_SWAP_TIMER_B MULTICALL_SPLIT_TIMER_B + +#define MULTICALL_SPLIT_SWAP_TIMER_WITH_ICON_L MULTICALL_SPLIT_SWAP_CID_2_L +#define MULTICALL_SPLIT_SWAP_TIMER_WITH_ICON_R REL_W(SPLIT_CID2_L_PAD+SPLIT_CID2_WIDTH-SPLIT_MORE_BTN_WIDTH) +#define MULTICALL_SPLIT_SWAP_TIMER_WITH_ICON_T MULTICALL_SPLIT_TIMER_T +#define MULTICALL_SPLIT_SWAP_TIMER_WITH_ICON_B MULTICALL_SPLIT_TIMER_B + +#define MULTICALL_SPLIT_SWAP_MORE_ICON_L REL_W(SPLIT_SWAP_MORE_BTN_L_PAD) +#define MULTICALL_SPLIT_SWAP_MORE_ICON_R REL_W(SPLIT_SWAP_MORE_BTN_L_PAD+SPLIT_SWAP_MORE_BTN_WIDTH) +#define MULTICALL_SPLIT_SWAP_MORE_ICON_T REL_H(SPLIT_SWAP_MORE_BTN_T_PAD) +#define MULTICALL_SPLIT_SWAP_MORE_ICON_B REL_H(SPLIT_SWAP_MORE_BTN_T_PAD+SPLIT_SWAP_MORE_BTN_HEIGHT) +/* L[HLD] + R[ACT] */ +/* + * End of MULTI-CALL SPLIT View + */ + +/* + * MULTI-CALL LIST View + * In Portrait mode + */ +#define MULTICALL_LIST_L REL_W(0) +#define MULTICALL_LIST_R REL_W(MAIN_SCREEN_W) +#define MULTICALL_LIST_T REL_H(CONF_LIST_T_PAD) +#define MULTICALL_LIST_B REL_H(CONF_LIST_T_PAD+CONF_LIST_HEIGHT) + +#define MULTICALL_LIST_HOLD_L REL_W(CONF_HOLD_L_PAD) +#define MULTICALL_LIST_HOLD_R REL_W(CONF_HOLD_L_PAD+CONF_HOLD_WIDTH) +#define MULTICALL_LIST_HOLD_T REL_H(CONF_HOLD_T_PAD) +#define MULTICALL_LIST_HOLD_B REL_H(CONF_HOLD_T_PAD+CONF_HOLD_HEIGHT) + +#define MULTICALL_LIST_TIMER_L REL_W(0) +#define MULTICALL_LIST_TIMER_R REL_W(MAIN_SCREEN_W) +#define MULTICALL_LIST_TIMER_T REL_H(CONF_TIMER_T_PAD) +#define MULTICALL_LIST_TIMER_B REL_H(CONF_TIMER_T_PAD+CONF_TIMER_HEIGHT) + +#define MULTICALL_LIST_BIG_END_L REL_W(CALL_BIG_END_L_PAD) +#define MULTICALL_LIST_BIG_END_R REL_W(CALL_BIG_END_L_PAD+CALL_BIG_END_WIDTH) +#define MULTICALL_LIST_BIG_END_T REL_H(CONF_CALL_BIG_END_T_PAD) +#define MULTICALL_LIST_BIG_END_B REL_H(CONF_CALL_BIG_END_T_PAD+CALL_BIG_END_HEIGHT) +/* + * End of MULTI-CALL LIST View + */ + + +/* + * SIX Button Layout + * In Portrait mode + */ +#define SIX_BTN_1_L REL_W(SIX_BTN_COL1_L_PAD) +#define SIX_BTN_1_R REL_W(SIX_BTN_COL1_L_PAD+SIX_BTN_COL1_WIDTH) +#define SIX_BTN_2_L REL_W(SIX_BTN_COL2_L_PAD) +#define SIX_BTN_2_R REL_W(SIX_BTN_COL2_L_PAD+SIX_BTN_COL1_WIDTH) +#define SIX_BTN_3_L REL_W(SIX_BTN_COL3_L_PAD) +#define SIX_BTN_3_R REL_W(SIX_BTN_COL3_L_PAD+SIX_BTN_COL1_WIDTH) + +#define SIX_BTN_1_T REL_H(SIX_BTN_ROW1_T_PAD) +#define SIX_BTN_1_B REL_H(SIX_BTN_ROW1_T_PAD+SIX_BTN_ROW1_HEIGHT) +#define SIX_BTN_2_T REL_H(SIX_BTN_ROW2_T_PAD) +#define SIX_BTN_2_B REL_H(SIX_BTN_ROW2_T_PAD+SIX_BTN_ROW1_HEIGHT) + +#define SIX_BTN_BIG_END_L REL_W(CALL_BIG_END_L_PAD) +#define SIX_BTN_BIG_END_R REL_W(CALL_BIG_END_L_PAD+CALL_BIG_END_WIDTH) +#define SIX_BTN_BIG_END_T REL_H(CALL_BIG_END_T_PAD) +#define SIX_BTN_BIG_END_B REL_H(CALL_BIG_END_T_PAD+CALL_BIG_END_HEIGHT) + +#define SIX_BTN_INCOMING_1_L SIX_BTN_BIG_END_L +#define SIX_BTN_INCOMING_1_R SIX_BTN_BIG_END_R +#define SIX_BTN_INCOMING_1_T REL_H(INCMG_CALL_BTN1_T_PAD) +#define SIX_BTN_INCOMING_1_B REL_H(INCMG_CALL_BTN1_T_PAD+INCMG_CALL_BTN_HEIGHT) + +#define SIX_BTN_INCOMING_2_L SIX_BTN_BIG_END_L +#define SIX_BTN_INCOMING_2_R SIX_BTN_BIG_END_R +#define SIX_BTN_INCOMING_2_T REL_H(INCMG_CALL_BTN2_T_PAD) +#define SIX_BTN_INCOMING_2_B REL_H(INCMG_CALL_BTN2_T_PAD+INCMG_CALL_BTN_HEIGHT) + +#define SIX_BTN_INCOMING_3_L SIX_BTN_BIG_END_L +#define SIX_BTN_INCOMING_3_R SIX_BTN_BIG_END_R +#define SIX_BTN_INCOMING_3_T REL_H(INCMG_CALL_BTN3_T_PAD) +#define SIX_BTN_INCOMING_3_B REL_H(INCMG_CALL_BTN3_T_PAD+INCMG_CALL_BTN_HEIGHT) +/* + * End of SIX Button Layout + */ + + +/* + * Navigation bar layout + */ +#define CALL_NAVIGATION_BAR_T REL_H(NAVIFRAME_T_PAD) +#define CALL_NAVIGATION_BAR_B REL_H(MAIN_SCREEN_H) +#define CALL_NAVIGATION_BAR_L REL_W(0) +#define CALL_NAVIGATION_BAR_R REL_W(MAIN_SCREEN_W) +/* + * End of Navigation bar layout + */ + + +/* + * END CALL View + * In Portrait mode + */ +#define ENDSINGLECALL_BACKGROUND_CID_L DIALLING_BACKGROUND_CID_L +#define ENDSINGLECALL_BACKGROUND_CID_R DIALLING_BACKGROUND_CID_R +#define ENDSINGLECALL_BACKGROUND_CID_T DIALLING_BACKGROUND_CID_T +#define ENDSINGLECALL_BACKGROUND_CID_B DIALLING_BACKGROUND_CID_B + +#define ENDSINGLECALL_CID_L DIALLING_CID_L +#define ENDSINGLECALL_CID_R DIALLING_CID_R +#define ENDSINGLECALL_CID_T DIALLING_CID_T +#define ENDSINGLECALL_CID_B DIALLING_CID_B + +#define ENDSINGLECALL_NAME_L DIALLING_NAME_L +#define ENDSINGLECALL_NAME_R DIALLING_NAME_R +#define ENDSINGLECALL_NAME_T DIALLING_NAME_T +#define ENDSINGLECALL_NAME_B DIALLING_NAME_B + +#define ENDSINGLECALL_NUMBER_L DIALLING_NUMBER_L +#define ENDSINGLECALL_NUMBER_R DIALLING_NUMBER_R +#define ENDSINGLECALL_NUMBER_T DIALLING_NUMBER_T +#define ENDSINGLECALL_NUMBER_B DIALLING_NUMBER_B + +#define ENDSINGLECALL_TIMER_L INCALL_TIMER_L +#define ENDSINGLECALL_TIMER_R INCALL_TIMER_R +#define ENDSINGLECALL_TIMER_T INCALL_TIMER_T +#define ENDSINGLECALL_TIMER_B INCALL_TIMER_B + +#define ENDSINGLECALL_VIDEO_BTN_L REL_W(VIDEO_BTN_POS1_L_PAD) +#define ENDSINGLECALL_VIDEO_BTN_R REL_W(VIDEO_BTN_POS1_L_PAD+VIDEO_BTN_POS1_WIDTH) +#define ENDSINGLECALL_VIDEO_BTN_T REL_H(VIDEO_BTN_POS1_T_PAD) +#define ENDSINGLECALL_VIDEO_BTN_B REL_H(VIDEO_BTN_POS1_T_PAD+VIDEO_BTN_POS1_HEIGHT) + +#define ENDSINGLECALL_VIDEO2_BTN_L REL_W(VIDEO_BTN_POS2_L_PAD) +#define ENDSINGLECALL_VIDEO2_BTN_R REL_W(VIDEO_BTN_POS2_L_PAD+VIDEO_BTN_POS2_WIDTH) +#define ENDSINGLECALL_VIDEO2_BTN_T REL_H(VIDEO_BTN_POS2_T_PAD) +#define ENDSINGLECALL_VIDEO2_BTN_B REL_H(VIDEO_BTN_POS2_T_PAD+VIDEO_BTN_POS2_HEIGHT) + +#define ENDSINGLECALL_VOICE_BTN_L REL_W(VOICE_BTN_POS1_L_PAD) +#define ENDSINGLECALL_VOICE_BTN_R REL_W(VOICE_BTN_POS1_L_PAD+VOICE_BTN_POS1_WIDTH) +#define ENDSINGLECALL_VOICE_BTN_T ENDSINGLECALL_VIDEO_BTN_T +#define ENDSINGLECALL_VOICE_BTN_B ENDSINGLECALL_VIDEO_BTN_B + +#define ENDSINGLECALL_VOICE2_BTN_L ENDSINGLECALL_VOICE_BTN_L +#define ENDSINGLECALL_VOICE2_BTN_R ENDSINGLECALL_VOICE_BTN_R +#define ENDSINGLECALL_VOICE2_BTN_T ENDSINGLECALL_VIDEO2_BTN_T +#define ENDSINGLECALL_VOICE2_BTN_B ENDSINGLECALL_VIDEO2_BTN_B + +#define ENDSINGLECALL_MSG_BTN_L REL_W(MSG_BTN_POS1_L_PAD) +#define ENDSINGLECALL_MSG_BTN_R REL_W(MSG_BTN_POS1_L_PAD+MSG_BTN_POS1_WIDTH) +#define ENDSINGLECALL_MSG_BTN_T REL_H(MSG_BTN_POS1_T_PAD) +#define ENDSINGLECALL_MSG_BTN_B REL_H(MSG_BTN_POS1_T_PAD+MSG_BTN_POS1_HEIGHT) + +#define ENDSINGLECALL_MSG2_BTN_L ENDSINGLECALL_MSG_BTN_L +#define ENDSINGLECALL_MSG2_BTN_R ENDSINGLECALL_MSG_BTN_R +#define ENDSINGLECALL_MSG2_BTN_T REL_H(MSG_BTN_POS2_T_PAD) +#define ENDSINGLECALL_MSG2_BTN_B REL_H(MSG_BTN_POS2_T_PAD+MSG_BTN_POS2_HEIGHT) + +#define ENDSINGLECALL_CONTACT_BTN_L REL_W(CONTACT_BTN_POS1_L_PAD) +#define ENDSINGLECALL_CONTACT_BTN_R REL_W(CONTACT_BTN_POS1_L_PAD+CONTACT_BTN_POS1_WIDTH) +#define ENDSINGLECALL_CONTACT_BTN_T REL_H(CONTACT_BTN_POS1_T_PAD) +#define ENDSINGLECALL_CONTACT_BTN_B REL_H(CONTACT_BTN_POS1_T_PAD+CONTACT_BTN_POS1_HEIGHT) +/* + * End of END CALL View + */ +#endif /*__VCUI_VIEW_LAYOUT_HD__*/ diff --git a/ui/vcui-view-layout-wvga.h b/ui/vcui-view-layout-wvga.h new file mode 100755 index 0000000..558a903 --- /dev/null +++ b/ui/vcui-view-layout-wvga.h @@ -0,0 +1,745 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VCUI_VIEW_LAYOUT_WVGA__ +#define __VCUI_VIEW_LAYOUT_WVGA__ + +#define COLOR_DEFAULT 0 0 0 255 +#define COLOR_BG_ALPHA 0 0 0 0 +#define COLOR_BG_FOR_HELD_CALL_DIM 0 0 0 150 + +/*#define BTN_EDGE_W 9*/ + +/* + * WVGA GUI Widget Dimensions + * In Portrait mode + */ +#define MAIN_SCREEN_W 480 +#define MAIN_SCREEN_H 800 + +#define INDICATOR_HEIGHT 40 +#define NAVIFRAME_TITLE_HEIGHT 75 + +#define MAIN_NAVIFRAME_W MAIN_SCREEN_W +#define MAIN_NAVIFRAME_H (MAIN_SCREEN_H-INDICATOR_HEIGHT-NAVIFRAME_TITLE_HEIGHT) +#define NAVIFRAME_T_PAD 40 + +#define QP_WIN_W MAIN_SCREEN_W +#define QP_WIN_H 104 + +#define DIALING_STATUS_L_PAD 0 +#define DIALING_STATUS_WIDTH MAIN_SCREEN_W +#define DIALING_STATUS_T_PAD 428 +#define DIALING_STATUS_HEIGHT 32 + +#define CALL_NAME_L_PAD 12 +#define CALL_NAME_WIDTH 456 +#define CALL_NAME_T_PAD 52 +#define CALL_NAME_HEIGHT 50 + +#define CALL_NUMBER_T_GAP 4 + +#define CALL_NUMBER_L_PAD CALL_NAME_L_PAD +#define CALL_NUMBER_WIDTH CALL_NAME_WIDTH +#define CALL_NUMBER_T_PAD (CALL_NAME_T_PAD+CALL_NAME_HEIGHT+CALL_NUMBER_T_GAP) +#define CALL_NUMBER_HEIGHT 32 + +#define CALLER_ID_L_PAD 145 +#define CALLER_ID_WIDTH 190 +#define CALLER_ID_T_PAD 176 +#define CALLER_ID_HEIGHT 190 + +#define BACKGROUND_CID_L_PAD 0 +#define BACKGROUND_CID_WIDTH MAIN_SCREEN_W +#define BACKGROUND_CID_T_PAD 0 +#define BACKGROUND_CID_HEIGHT MAIN_SCREEN_H + +#define ACCEPT_BTN_L_PAD 26 +#define ACCEPT_BTN_WIDTH 202 +#define ACCEPT_BTN_T_PAD 620 +#define ACCEPT_BTN_HEIGHT 70 + +#define REJECT_BTN_L_GAP 24 + +#define REJECT_BTN_L_PAD (ACCEPT_BTN_L_PAD+ACCEPT_BTN_WIDTH+REJECT_BTN_L_GAP) +#define REJECT_BTN_WIDTH ACCEPT_BTN_WIDTH +#define REJECT_BTN_T_PAD ACCEPT_BTN_T_PAD +#define REJECT_BTN_HEIGHT ACCEPT_BTN_HEIGHT + +#define REJECT_W_MSG_BTN_T_GAP 25 + +#define REJECT_W_MSG_BTN_L_PAD ACCEPT_BTN_L_PAD +#define REJECT_W_MSG_BTN_WIDTH 428 +#define REJECT_W_MSG_BTN_T_PAD (ACCEPT_BTN_T_PAD+ACCEPT_BTN_HEIGHT+REJECT_W_MSG_BTN_T_GAP) +#define REJECT_W_MSG_BTN_HEIGHT 56 + +#define INCALL_HOLD_BTN_L_PAD 26 +#define INCALL_HOLD_BTN_WIDTH 73 +#define INCALL_HOLD_BTN_T_PAD 417 +#define INCALL_HOLD_BTN_HEIGHT 54 + +#define INCALL_TIMER_L_PAD 26 +#define INCALL_TIMER_WIDTH 428 +#define INCALL_TIMER_T_PAD 428 +#define INCALL_TIMER_HEIGHT 32 + +#define INCALL_SHARE_BG_T_PAD 365 /*approx*/ +#define INCALL_SHARE_BG_HEIGHT 774 /*approx*/ + +#define KEYPAD_TIMER_L_PAD 26 +#define KEYPAD_TIMER_WIDTH 428 +#define KEYPAD_TIMER_T_PAD 240 +#define KEYPAD_TIMER_HEIGHT 32 + +#define KEYPAD_ENTRY_TXT_L_PAD KEYPAD_TIMER_L_PAD +#define KEYPAD_ENTRY_TXT_WIDTH KEYPAD_TIMER_WIDTH +#define KEYPAD_ENTRY_TXT_T_PAD 57 +#define KEYPAD_ENTRY_TXT_HEIGHT 70 + +#define KEYPAD_BTNS_T_PAD 289 +#define KEYPAD_BTNS_WIDTH MAIN_SCREEN_W +#define KEYPAD_BTNS_HEIGHT 391 + +#define KEYPAD_HIDE_BTN_L_PAD KEYPAD_TIMER_L_PAD +#define KEYPAD_HIDE_BTN_WIDTH 202 +#define KEYPAD_HIDE_BTN_T_PAD 712 +#define KEYPAD_HIDE_BTN_HEIGHT 70 + +#define KEYPAD_BTN_GAP 13 +#define KEYPAD_END_BTN_L_PAD (KEYPAD_HIDE_BTN_L_PAD+KEYPAD_HIDE_BTN_WIDTH+KEYPAD_BTN_GAP) +#define KEYPAD_END_BTN_WIDTH KEYPAD_HIDE_BTN_WIDTH + +#define SPLIT_CID1_L_PAD 50 +#define SPLIT_CID1_WIDTH 190 +#define SPLIT_CID1_T_PAD 137 +#define SPLIT_CID1_HEIGHT 190 + +#define SPLIT_PAUSE_L_PAD (SPLIT_CID1_L_PAD+4) +#define SPLIT_PAUSE_WIDTH 40 +#define SPLIT_PAUSE_HEIGHT 40 +#define SPLIT_PAUSE_T_PAD (SPLIT_CID1_T_PAD+SPLIT_CID1_HEIGHT-8-SPLIT_PAUSE_HEIGHT) + +#define SPLIT_CID2_L_PAD 300 +#define SPLIT_CID2_WIDTH 130 +#define SPLIT_CID2_T_PAD 167 +#define SPLIT_CID2_HEIGHT 130 + +#define SPLIT_PLAY_L_PAD (SPLIT_CID2_L_PAD+8) +#define SPLIT_PLAY_WIDTH 25 +#define SPLIT_PLAY_HEIGHT 25 +#define SPLIT_PLAY_T_PAD (SPLIT_CID2_T_PAD+SPLIT_CID2_HEIGHT-8-SPLIT_PLAY_HEIGHT) + +#define SPLIT_NAME1_L_PAD 24 +#define SPLIT_NAME1_WIDTH 242 +#define SPLIT_NAME1_T_PAD 90 +#define SPLIT_NAME1_HEIGHT 36 + +#define SPLIT_NAME2_L_PAD (SPLIT_NAME1_L_PAD+SPLIT_NAME1_WIDTH+14) +#define SPLIT_NAME2_WIDTH 170 +#define SPLIT_NAME2_T_PAD 136 +#define SPLIT_NAME2_HEIGHT 24 + +#define SPLIT_TIMER_TXT_T_PAD 343 +#define SPLIT_TIMER_TXT_HEIGHT 28 + +#define SPLIT_MORE_BTN_WIDTH 24 +#define SPLIT_MORE_BTN_L_PAD (SPLIT_CID2_L_PAD+SPLIT_CID2_WIDTH-SPLIT_MORE_BTN_WIDTH) +#define SPLIT_ONHOLD_TXT_W_ICON_WIDTH (SPLIT_CID2_WIDTH-SPLIT_MORE_BTN_WIDTH) +#define SPLIT_ONHOLD_TXT_T_PAD 308 +#define SPLIT_ONHOLD_TXT_HEIGHT 24 + +#define SPLIT_SWAP_CID1_L_PAD 47 +#define SPLIT_SWAP_CID1_WIDTH 130 + +#define SPLIT_SWAP_PLAY_L_PAD (SPLIT_SWAP_CID1_L_PAD+8) +#define SPLIT_SWAP_PLAY_WIDTH 25 + +#define SPLIT_SWAP_CID2_L_PAD 240 +#define SPLIT_SWAP_CID2_WIDTH 190 + +#define SPLIT_SWAP_PAUSE_L_PAD (SPLIT_SWAP_CID2_L_PAD+4) +#define SPLIT_SWAP_PAUSE_WIDTH 40 + +#define SPLIT_SWAP_NAME1_L_PAD 30 +#define SPLIT_SWAP_NAME1_WIDTH 170 + +#define SPLIT_SWAP_NAME2_L_PAD (SPLIT_SWAP_NAME1_L_PAD+SPLIT_SWAP_NAME1_WIDTH+14) +#define SPLIT_SWAP_NAME2_WIDTH 242 + +#define SPLIT_SWAP_MORE_BTN_WIDTH 40 +#define SPLIT_SWAP_MORE_BTN_L_PAD (SPLIT_SWAP_CID2_L_PAD+SPLIT_SWAP_CID2_WIDTH-SPLIT_SWAP_MORE_BTN_WIDTH) +#define SPLIT_SWAP_MORE_BTN_T_PAD (SPLIT_TIMER_TXT_T_PAD-6) +#define SPLIT_SWAP_MORE_BTN_HEIGHT 40 +#define SPLIT_TIMER_TXT_W_ICON_WIDTH (SPLIT_SWAP_CID2_WIDTH-SPLIT_SWAP_MORE_BTN_WIDTH) + +#define CONF_LIST_T_PAD 115 +#define CONF_LIST_HEIGHT (70*5+1*5) /*row-height(70) row-gap(1)*/ + +#define CONF_HOLD_WIDTH 45 +#define CONF_HOLD_L_PAD (MAIN_SCREEN_W-26-CONF_HOLD_WIDTH) +#define CONF_HOLD_T_PAD 620 +#define CONF_HOLD_HEIGHT 39 + +#define CONF_TIMER_T_PAD 620 +#define CONF_TIMER_HEIGHT 52 + +#define REJ_MSG_NEW_BTN_L_PAD 26 +#define REJ_MSG_NEW_BTN_WIDTH 428 +#define REJ_MSG_NEW_BTN_T_PAD 715 +#define REJ_MSG_NEW_BTN_HEIGHT 56 + +#define REJ_MSG_LIST_T_PAD 20 +#define REJ_MSG_LIST_HEIGHT 685 + +#define SIX_BTN_COL1_L_PAD 26 +#define SIX_BTN_COL1_WIDTH 134 +#define SIX_BTN_COL2_L_PAD (SIX_BTN_COL1_L_PAD+SIX_BTN_COL1_WIDTH+13) +#define SIX_BTN_COL3_L_PAD (SIX_BTN_COL2_L_PAD+SIX_BTN_COL1_WIDTH+13) +#define SIX_BTN_ROW1_T_PAD 494 +#define SIX_BTN_ROW1_HEIGHT 88 +#define SIX_BTN_ROW2_T_PAD (SIX_BTN_ROW1_T_PAD+SIX_BTN_ROW1_HEIGHT+13) + +#define CALL_BIG_END_L_PAD 26 +#define CALL_BIG_END_WIDTH 428 +#define CALL_BIG_END_T_PAD 712 +#define CALL_BIG_END_HEIGHT 70 + +#define INCMG_CALL_BTN1_T_PAD 438 +#define INCMG_CALL_BTN_HEIGHT CALL_BIG_END_HEIGHT +#define INCMG_CALL_BTN2_T_PAD 524 +#define INCMG_CALL_BTN3_T_PAD 610 + +#define VIDEO_BTN_POS1_L_PAD 26 +#define VIDEO_BTN_POS1_WIDTH 202 +#define VIDEO_BTN_POS1_T_PAD 524 +#define VIDEO_BTN_POS1_HEIGHT 70 +#define VIDEO_BTN_POS2_L_PAD VIDEO_BTN_POS1_L_PAD +#define VIDEO_BTN_POS2_WIDTH VIDEO_BTN_POS1_WIDTH +#define VIDEO_BTN_POS2_T_PAD 610 +#define VIDEO_BTN_POS2_HEIGHT VIDEO_BTN_POS1_HEIGHT + +#define VOICE_BTN_POS1_L_PAD (VIDEO_BTN_POS1_L_PAD+VIDEO_BTN_POS1_WIDTH+40) +#define VOICE_BTN_POS1_WIDTH VIDEO_BTN_POS1_WIDTH + +#define MSG_BTN_POS1_L_PAD VIDEO_BTN_POS1_L_PAD +#define MSG_BTN_POS1_WIDTH 428 +#define MSG_BTN_POS1_T_PAD 610 +#define MSG_BTN_POS1_HEIGHT VIDEO_BTN_POS1_HEIGHT +#define MSG_BTN_POS2_T_PAD 712 +#define MSG_BTN_POS2_HEIGHT VIDEO_BTN_POS1_HEIGHT + +#define CONTACT_BTN_POS1_L_PAD VIDEO_BTN_POS1_L_PAD +#define CONTACT_BTN_POS1_WIDTH MSG_BTN_POS1_WIDTH +#define CONTACT_BTN_POS1_T_PAD 712 +#define CONTACT_BTN_POS1_HEIGHT VIDEO_BTN_POS1_HEIGHT + +#define QP_CID_L_PAD 10 +#define QP_CID_WIDTH 82 +#define QP_CID_T_PAD 11 +#define QP_CID_HEIGHT 82 + +#define QP_END_BTN_L_PAD 102 +#define QP_END_BTN_WIDTH 368 +#define QP_END_BTN_T_PAD 50 +#define QP_END_BTN_HEIGHT 40 + +#define QP_NAME_L_PAD 102 +#define QP_NAME_WIDTH 248 +#define QP_NAME_T_PAD 8 +#define QP_NAME_HEIGHT 30 + +#define QP_TIMER_L_PAD 370 +/* + * End of WVGA GUI Widget Dimensions + */ + + +/* + * Relative positions + * In Portrait mode + */ +/* Relative X & Y positions of widgets w.r.t. Full Screen */ +#define REL_W(x) ((x)/MAIN_SCREEN_W) +#define REL_H(y) ((y)/MAIN_SCREEN_H) + +/* Relative X & Y positions of widgets w.r.t. Navi-frame layout */ +/*#define WL_NB_H 94*/ +#define REL_NAVIFRAME_W(x) ((x)/MAIN_NAVIFRAME_W) +#define REL_NAVIFRAME_H(y) ((y)/MAIN_NAVIFRAME_H) + +/* Relative X & Y positions of widgets w.r.t. ACC/REJ ICON layout */ +#define REL_LOCK_W(x) ((x)/483) /*approx*/ +#define REL_LOCK_H(y) ((y)/198) /*approx*/ +/* Relative X & Y positions of widgets w.r.t. REJ-W-MSG ICON layout */ +#define REL_LOCK_MSG_W(x) ((x)/348) /*approx*/ +#define REL_LOCK_MSG_H(y) ((y)/200) /*approx*/ + +/* Relative X & Y positions of widgets w.r.t. Keypad Buttons layout */ +#define REL_KEYPAD_W(x) ((x)/KEYPAD_BTNS_WIDTH) +#define REL_KEYPAD_H(y) ((y)/KEYPAD_BTNS_HEIGHT) + /* + * End of Relative positions + */ + + +/* + * MO/Dialing view & MT/Incoming view + * In Portrait mode + */ +#define DIALLING_STATUS_L REL_W(DIALING_STATUS_L_PAD) +#define DIALLING_STATUS_R REL_W(DIALING_STATUS_L_PAD+DIALING_STATUS_WIDTH) +#define DIALLING_STATUS_T REL_H(DIALING_STATUS_T_PAD) +#define DIALLING_STATUS_B REL_H(DIALING_STATUS_T_PAD+DIALING_STATUS_HEIGHT) + +/* +#define DIALLING_MT_STATUS_L REL_W(123) +#define DIALLING_MT_STATUS_R REL_W(357) +#define DIALLING_MT_STATUS_T REL_H(375) +#define DIALLING_MT_STATUS_B REL_H(407) +*/ + +#define DIALLING_NAME_L REL_W(CALL_NAME_L_PAD) +#define DIALLING_NAME_R REL_W(CALL_NAME_L_PAD+CALL_NAME_WIDTH) +#define DIALLING_NAME_T REL_H(CALL_NAME_T_PAD) +#define DIALLING_NAME_B REL_H(CALL_NAME_T_PAD+CALL_NAME_HEIGHT) + +#define DIALLING_NUMBER_L REL_W(CALL_NUMBER_L_PAD) +#define DIALLING_NUMBER_R REL_W(CALL_NUMBER_L_PAD+CALL_NUMBER_WIDTH) +#define DIALLING_NUMBER_T REL_H(CALL_NUMBER_T_PAD) +#define DIALLING_NUMBER_B REL_H(CALL_NUMBER_T_PAD+CALL_NUMBER_HEIGHT) + +#define DIALLING_CID_L REL_W(CALLER_ID_L_PAD) +#define DIALLING_CID_R REL_W(CALLER_ID_L_PAD+CALLER_ID_WIDTH) +#define DIALLING_CID_T REL_H(CALLER_ID_T_PAD) +#define DIALLING_CID_B REL_H(CALLER_ID_T_PAD+CALLER_ID_HEIGHT) + +#define DIALLING_BACKGROUND_CID_L REL_W(BACKGROUND_CID_L_PAD) +#define DIALLING_BACKGROUND_CID_R REL_W(BACKGROUND_CID_L_PAD+BACKGROUND_CID_WIDTH) +#define DIALLING_BACKGROUND_CID_T REL_H(BACKGROUND_CID_T_PAD) +#define DIALLING_BACKGROUND_CID_B REL_H(BACKGROUND_CID_T_PAD+BACKGROUND_CID_HEIGHT) + +/* accept - MT view */ +#define DIALLING_MT_BTN1_L REL_W(ACCEPT_BTN_L_PAD) +#define DIALLING_MT_BTN1_R REL_W(ACCEPT_BTN_L_PAD+ACCEPT_BTN_WIDTH) +#define DIALLING_MT_BTN1_T REL_H(ACCEPT_BTN_T_PAD) +#define DIALLING_MT_BTN1_B REL_H(ACCEPT_BTN_T_PAD+ACCEPT_BTN_HEIGHT) + +/* reject - MT view */ +#define DIALLING_MT_BTN2_L REL_W(REJECT_BTN_L_PAD) +#define DIALLING_MT_BTN2_R REL_W(REJECT_BTN_L_PAD+REJECT_BTN_WIDTH) +#define DIALLING_MT_BTN2_T REL_H(REJECT_BTN_T_PAD) +#define DIALLING_MT_BTN2_B REL_H(REJECT_BTN_T_PAD+REJECT_BTN_HEIGHT) +/* + * End of MO/Dialing view & MT/Incoming view + */ + + +/* + * MT LOCK View + * In Portrait mode + */ +#define INCOMING_LOCK_ACCEPT_BG_L REL_W(-182) +#define INCOMING_LOCK_ACCEPT_BG_R REL_W(140) +#define INCOMING_LOCK_ACCEPT_BG_T REL_H(591) +#define INCOMING_LOCK_ACCEPT_BG_B REL_H(715) + +#define INCOMING_LOCK_ACCEPT_ICON_L REL_LOCK_W(202) +#define INCOMING_LOCK_ACCEPT_ICON_R REL_LOCK_W(272) +#define INCOMING_LOCK_ACCEPT_ICON_T REL_LOCK_H(23) +#define INCOMING_LOCK_ACCEPT_ICON_B REL_LOCK_H(93) + +#define INCOMING_LOCK_ACCEPT_TEXT_L REL_LOCK_W(30) +#define INCOMING_LOCK_ACCEPT_TEXT_R REL_LOCK_W(182) +#define INCOMING_LOCK_ACCEPT_TEXT_T INCOMING_LOCK_ACCEPT_ICON_T +#define INCOMING_LOCK_ACCEPT_TEXT_B INCOMING_LOCK_ACCEPT_ICON_B + +#define INCOMING_LOCK_REJECT_BG_L REL_W(340) +#define INCOMING_LOCK_REJECT_BG_R REL_W(662) +#define INCOMING_LOCK_REJECT_BG_T INCOMING_LOCK_ACCEPT_BG_T +#define INCOMING_LOCK_REJECT_BG_B INCOMING_LOCK_ACCEPT_BG_B + +#define INCOMING_LOCK_REJECT_ICON_L REL_LOCK_W(50) +#define INCOMING_LOCK_REJECT_ICON_R REL_LOCK_W(120) +#define INCOMING_LOCK_REJECT_ICON_T INCOMING_LOCK_ACCEPT_ICON_T +#define INCOMING_LOCK_REJECT_ICON_B INCOMING_LOCK_ACCEPT_ICON_B + +#define INCOMING_LOCK_REJECT_TEXT_L REL_LOCK_W(130) +#define INCOMING_LOCK_REJECT_TEXT_R REL_LOCK_W(282) +#define INCOMING_LOCK_REJECT_TEXT_T INCOMING_LOCK_REJECT_ICON_T +#define INCOMING_LOCK_REJECT_TEXT_B INCOMING_LOCK_REJECT_ICON_B +/* + * End of MT LOCK View + */ + + +/* + * KEYPAD View + * In Portrait mode + */ +#define INCALL_DIALER_TIMER_L REL_W(KEYPAD_TIMER_L_PAD) +#define INCALL_DIALER_TIMER_R REL_W(KEYPAD_TIMER_L_PAD+KEYPAD_TIMER_WIDTH) +#define INCALL_DIALER_TIMER_T REL_H(KEYPAD_TIMER_T_PAD) +#define INCALL_DIALER_TIMER_B REL_H(KEYPAD_TIMER_L_PAD+KEYPAD_TIMER_HEIGHT) + +#define INCALL_DIALER_NAME_L INCALL_DIALER_TIMER_L +#define INCALL_DIALER_NAME_R INCALL_DIALER_TIMER_R +#define INCALL_DIALER_NAME_T INCALL_DIALER_TIMER_T +#define INCALL_DIALER_NAME_B INCALL_DIALER_TIMER_B + +/* +#define DIALLING_KEYPAD_T_BF REL_H(319) +#define DIALLING_KEYPAD_B_BF REL_H(710) +*/ + +#define DIALLING_KEYPAD_L REL_W(0) +#define DIALLING_KEYPAD_R REL_W(MAIN_SCREEN_W) +#define DIALLING_KEYPAD_T REL_H(KEYPAD_BTNS_T_PAD) +#define DIALLING_KEYPAD_B REL_H(KEYPAD_BTNS_T_PAD+KEYPAD_BTNS_HEIGHT) + +#define DIALLING_ENTRY_TEXT_L REL_W(KEYPAD_ENTRY_TXT_L_PAD) +#define DIALLING_ENTRY_TEXT_R REL_W(KEYPAD_ENTRY_TXT_L_PAD+KEYPAD_ENTRY_TXT_WIDTH) +#define DIALLING_ENTRY_TEXT_T REL_H(KEYPAD_ENTRY_TXT_T_PAD) +#define DIALLING_ENTRY_TEXT_B REL_H(KEYPAD_ENTRY_TXT_T_PAD+KEYPAD_ENTRY_TXT_HEIGHT) + +#define DIALER_BTN1_L REL_W(KEYPAD_HIDE_BTN_L_PAD) +#define DIALER_BTN1_R REL_W(KEYPAD_HIDE_BTN_L_PAD+KEYPAD_HIDE_BTN_WIDTH) +#define DIALER_BTN1_T REL_H(KEYPAD_HIDE_BTN_T_PAD) +#define DIALER_BTN1_B REL_H(KEYPAD_HIDE_BTN_T_PAD+KEYPAD_HIDE_BTN_HEIGHT) + +#define DIALER_BTN2_L REL_W(KEYPAD_END_BTN_L_PAD) +#define DIALER_BTN2_R REL_W(KEYPAD_END_BTN_L_PAD+KEYPAD_END_BTN_WIDTH) +#define DIALER_BTN2_T DIALER_BTN1_T +#define DIALER_BTN2_B DIALER_BTN1_B +/* + * End of KEYPAD View + */ + + +/* + * INCALL View + * In Portrait mode + */ +#define INCALL_CID_L DIALLING_CID_L +#define INCALL_CID_R DIALLING_CID_R +#define INCALL_CID_T DIALLING_CID_T +#define INCALL_CID_B DIALLING_CID_B + +/* +#define INCALL_CID_DIM_T DIALLING_CID_T +#define INCALL_CID_DIM_B DIALLING_CID_B +#define INCALL_CID_DIM_L REL_W(145) +#define INCALL_CID_DIM_R REL_W(334) +*/ + +#define INCALL_BACKGROUND_CID_L DIALLING_BACKGROUND_CID_L +#define INCALL_BACKGROUND_CID_R DIALLING_BACKGROUND_CID_R +#define INCALL_BACKGROUND_CID_T DIALLING_BACKGROUND_CID_T +#define INCALL_BACKGROUND_CID_B DIALLING_BACKGROUND_CID_B + +#define INCALL_NAME_L DIALLING_NAME_L +#define INCALL_NAME_R DIALLING_NAME_R +#define INCALL_NAME_T DIALLING_NAME_T +#define INCALL_NAME_B DIALLING_NAME_B + +#define INCALL_NUMBER_L DIALLING_NUMBER_L +#define INCALL_NUMBER_R DIALLING_NUMBER_R +#define INCALL_NUMBER_T DIALLING_NUMBER_T +#define INCALL_NUMBER_B DIALLING_NUMBER_B + +#define INCALL_HOLD_L REL_W(INCALL_HOLD_BTN_L_PAD) +#define INCALL_HOLD_R REL_W(INCALL_HOLD_BTN_L_PAD+INCALL_HOLD_BTN_WIDTH) +#define INCALL_HOLD_T REL_H(INCALL_HOLD_BTN_T_PAD) +#define INCALL_HOLD_B REL_H(INCALL_HOLD_BTN_T_PAD+INCALL_HOLD_BTN_HEIGHT) + +#define INCALL_TIMER_L REL_W(INCALL_TIMER_L_PAD) +#define INCALL_TIMER_R REL_W(INCALL_TIMER_L_PAD+INCALL_TIMER_WIDTH) +#define INCALL_TIMER_T REL_H(INCALL_TIMER_T_PAD) +#define INCALL_TIMER_B REL_H(INCALL_TIMER_T_PAD+INCALL_TIMER_HEIGHT) + +#define INCALL_BACKGROUND_SHARE_L REL_W(0) +#define INCALL_BACKGROUND_SHARE_R REL_W(MAIN_SCREEN_W) +#define INCALL_BACKGROUND_SHARE_T REL_H(INCALL_SHARE_BG_T_PAD) +#define INCALL_BACKGROUND_SHARE_B REL_H(INCALL_SHARE_BG_T_PAD+INCALL_SHARE_BG_HEIGHT) +/* + * End of INCALL View + */ + + +/* + * MULTI-CALL SPLIT View + * In Portrait mode + */ +/* L[ACT] + R[HLD] */ +#define MULTICALL_SPLIT_BACKGROUND_CID_L INCALL_BACKGROUND_CID_L +#define MULTICALL_SPLIT_BACKGROUND_CID_R INCALL_BACKGROUND_CID_R +#define MULTICALL_SPLIT_BACKGROUND_CID_T INCALL_BACKGROUND_CID_T +#define MULTICALL_SPLIT_BACKGROUND_CID_B INCALL_BACKGROUND_CID_B + +#define MULTICALL_SPLIT_CID_1_L REL_W(SPLIT_CID1_L_PAD) +#define MULTICALL_SPLIT_CID_1_R REL_W(SPLIT_CID1_L_PAD+SPLIT_CID1_WIDTH) +#define MULTICALL_SPLIT_CID_1_T REL_H(SPLIT_CID1_T_PAD) +#define MULTICALL_SPLIT_CID_1_B REL_H(SPLIT_CID1_T_PAD+SPLIT_CID1_HEIGHT) + +#define MULTICALL_SPLIT_PAUSE_L REL_W(SPLIT_PAUSE_L_PAD) +#define MULTICALL_SPLIT_PAUSE_R REL_W(SPLIT_PAUSE_L_PAD+SPLIT_PAUSE_WIDTH) +#define MULTICALL_SPLIT_PAUSE_T REL_H(SPLIT_PAUSE_T_PAD) +#define MULTICALL_SPLIT_PAUSE_B REL_H(SPLIT_PAUSE_T_PAD+SPLIT_PAUSE_HEIGHT) + +#define MULTICALL_SPLIT_CID_2_L REL_W(SPLIT_CID2_L_PAD) +#define MULTICALL_SPLIT_CID_2_R REL_W(SPLIT_CID2_L_PAD+SPLIT_CID2_WIDTH) +#define MULTICALL_SPLIT_CID_2_T REL_H(SPLIT_CID2_T_PAD) +#define MULTICALL_SPLIT_CID_2_B REL_H(SPLIT_CID2_T_PAD+SPLIT_CID2_HEIGHT) + +#define MULTICALL_SPLIT_PLAY_L REL_W(SPLIT_PLAY_L_PAD) +#define MULTICALL_SPLIT_PLAY_R REL_W(SPLIT_PLAY_L_PAD+SPLIT_PLAY_WIDTH) +#define MULTICALL_SPLIT_PLAY_T REL_H(SPLIT_PLAY_T_PAD) +#define MULTICALL_SPLIT_PLAY_B REL_H(SPLIT_PLAY_T_PAD+SPLIT_PLAY_HEIGHT) + +#define MULTICALL_SPLIT_NAME_1_L REL_W(SPLIT_NAME1_L_PAD) +#define MULTICALL_SPLIT_NAME_1_R REL_W(SPLIT_NAME1_L_PAD+SPLIT_NAME1_WIDTH) +#define MULTICALL_SPLIT_NAME_1_T REL_H(SPLIT_NAME1_T_PAD) +#define MULTICALL_SPLIT_NAME_1_B REL_H(SPLIT_NAME1_T_PAD+SPLIT_NAME1_HEIGHT) + +#define MULTICALL_SPLIT_NAME_2_L REL_W(SPLIT_NAME2_L_PAD) +#define MULTICALL_SPLIT_NAME_2_R REL_W(SPLIT_NAME2_L_PAD+SPLIT_NAME2_WIDTH) +#define MULTICALL_SPLIT_NAME_2_T REL_H(SPLIT_NAME2_T_PAD) +#define MULTICALL_SPLIT_NAME_2_B REL_H(SPLIT_NAME2_T_PAD+SPLIT_NAME2_HEIGHT) + +#define MULTICALL_SPLIT_TIMER_L MULTICALL_SPLIT_CID_1_L +#define MULTICALL_SPLIT_TIMER_R MULTICALL_SPLIT_CID_1_R +#define MULTICALL_SPLIT_TIMER_T REL_H(SPLIT_TIMER_TXT_T_PAD) +#define MULTICALL_SPLIT_TIMER_B REL_H(SPLIT_TIMER_TXT_T_PAD+SPLIT_TIMER_TXT_HEIGHT) + +#define MULTICALL_SPLIT_ON_HOLD_TXT_L MULTICALL_SPLIT_CID_2_L +#define MULTICALL_SPLIT_ON_HOLD_TXT_R MULTICALL_SPLIT_CID_2_R +#define MULTICALL_SPLIT_ON_HOLD_TXT_T REL_H(SPLIT_ONHOLD_TXT_T_PAD) +#define MULTICALL_SPLIT_ON_HOLD_TXT_B REL_H(SPLIT_ONHOLD_TXT_T_PAD+SPLIT_ONHOLD_TXT_HEIGHT) + +#define MULTICALL_SPLIT_ON_HOLD_TXT_WITH_ICON_L MULTICALL_SPLIT_CID_2_L +#define MULTICALL_SPLIT_ON_HOLD_TXT_WITH_ICON_R REL_W(SPLIT_ONHOLD_TXT_W_ICON_WIDTH) +#define MULTICALL_SPLIT_ON_HOLD_TXT_WITH_ICON_T MULTICALL_SPLIT_ON_HOLD_TXT_T +#define MULTICALL_SPLIT_ON_HOLD_TXT_WITH_ICON_B MULTICALL_SPLIT_ON_HOLD_TXT_B + +#define MULTICALL_SPLIT_MORE_ICON_L REL_W(SPLIT_MORE_BTN_L_PAD) +#define MULTICALL_SPLIT_MORE_ICON_R REL_W(SPLIT_MORE_BTN_L_PAD+SPLIT_MORE_BTN_WIDTH) +#define MULTICALL_SPLIT_MORE_ICON_T MULTICALL_SPLIT_ON_HOLD_TXT_T +#define MULTICALL_SPLIT_MORE_ICON_B MULTICALL_SPLIT_ON_HOLD_TXT_B +/* L[ACT] + R[HLD] */ + +/* L[HLD] + R[ACT] */ +#define MULTICALL_SPLIT_SWAP_CID_1_L REL_W(SPLIT_SWAP_CID1_L_PAD) +#define MULTICALL_SPLIT_SWAP_CID_1_R REL_W(SPLIT_SWAP_CID1_L_PAD+SPLIT_SWAP_CID1_WIDTH) +#define MULTICALL_SPLIT_SWAP_CID_1_T MULTICALL_SPLIT_CID_2_T +#define MULTICALL_SPLIT_SWAP_CID_1_B MULTICALL_SPLIT_CID_2_B + +#define MULTICALL_SPLIT_SWAP_PLAY_L REL_W(SPLIT_SWAP_PLAY_L_PAD) +#define MULTICALL_SPLIT_SWAP_PLAY_R REL_W(SPLIT_SWAP_PLAY_L_PAD+SPLIT_SWAP_PLAY_WIDTH) +#define MULTICALL_SPLIT_SWAP_PLAY_T MULTICALL_SPLIT_PLAY_T +#define MULTICALL_SPLIT_SWAP_PLAY_B MULTICALL_SPLIT_PLAY_B + +#define MULTICALL_SPLIT_SWAP_CID_2_L REL_W(SPLIT_SWAP_CID2_L_PAD) +#define MULTICALL_SPLIT_SWAP_CID_2_R REL_W(SPLIT_SWAP_CID2_L_PAD+SPLIT_SWAP_CID2_WIDTH) +#define MULTICALL_SPLIT_SWAP_CID_2_T MULTICALL_SPLIT_CID_1_T +#define MULTICALL_SPLIT_SWAP_CID_2_B MULTICALL_SPLIT_CID_1_B + +#define MULTICALL_SPLIT_SWAP_PAUSE_L REL_W(SPLIT_SWAP_PAUSE_L_PAD) +#define MULTICALL_SPLIT_SWAP_PAUSE_R REL_W(SPLIT_SWAP_PAUSE_L_PAD+SPLIT_SWAP_PAUSE_WIDTH) +#define MULTICALL_SPLIT_SWAP_PAUSE_T MULTICALL_SPLIT_PAUSE_T +#define MULTICALL_SPLIT_SWAP_PAUSE_B MULTICALL_SPLIT_PAUSE_B + +#define MULTICALL_SPLIT_SWAP_NAME_1_L MULTICALL_SPLIT_NAME_1_L +#define MULTICALL_SPLIT_SWAP_NAME_1_R REL_W(SPLIT_SWAP_NAME1_L_PAD+SPLIT_SWAP_NAME1_WIDTH) +#define MULTICALL_SPLIT_SWAP_NAME_1_T MULTICALL_SPLIT_NAME_2_T +#define MULTICALL_SPLIT_SWAP_NAME_1_B MULTICALL_SPLIT_NAME_2_B + +#define MULTICALL_SPLIT_SWAP_NAME_2_L REL_W(SPLIT_SWAP_NAME2_L_PAD) +#define MULTICALL_SPLIT_SWAP_NAME_2_R REL_W(SPLIT_SWAP_NAME2_L_PAD+SPLIT_SWAP_NAME2_WIDTH) +#define MULTICALL_SPLIT_SWAP_NAME_2_T MULTICALL_SPLIT_NAME_1_T +#define MULTICALL_SPLIT_SWAP_NAME_2_B MULTICALL_SPLIT_NAME_1_B + +#define MULTICALL_SPLIT_SWAP_ON_HOLD_TXT_L MULTICALL_SPLIT_SWAP_CID_1_L +#define MULTICALL_SPLIT_SWAP_ON_HOLD_TXT_R MULTICALL_SPLIT_SWAP_CID_1_R +#define MULTICALL_SPLIT_SWAP_ON_HOLD_TXT_T MULTICALL_SPLIT_ON_HOLD_TXT_T +#define MULTICALL_SPLIT_SWAP_ON_HOLD_TXT_B MULTICALL_SPLIT_ON_HOLD_TXT_B + +#define MULTICALL_SPLIT_SWAP_TIMER_L MULTICALL_SPLIT_SWAP_CID_2_L +#define MULTICALL_SPLIT_SWAP_TIMER_R MULTICALL_SPLIT_SWAP_CID_2_R +#define MULTICALL_SPLIT_SWAP_TIMER_T MULTICALL_SPLIT_TIMER_T +#define MULTICALL_SPLIT_SWAP_TIMER_B MULTICALL_SPLIT_TIMER_B + +#define MULTICALL_SPLIT_SWAP_TIMER_WITH_ICON_L MULTICALL_SPLIT_SWAP_CID_2_L +#define MULTICALL_SPLIT_SWAP_TIMER_WITH_ICON_R REL_W(SPLIT_TIMER_TXT_W_ICON_WIDTH) +#define MULTICALL_SPLIT_SWAP_TIMER_WITH_ICON_T MULTICALL_SPLIT_TIMER_T +#define MULTICALL_SPLIT_SWAP_TIMER_WITH_ICON_B MULTICALL_SPLIT_TIMER_B + +#define MULTICALL_SPLIT_SWAP_MORE_ICON_L REL_W(SPLIT_SWAP_MORE_BTN_L_PAD) +#define MULTICALL_SPLIT_SWAP_MORE_ICON_R REL_W(SPLIT_SWAP_MORE_BTN_L_PAD+SPLIT_SWAP_MORE_BTN_WIDTH) +#define MULTICALL_SPLIT_SWAP_MORE_ICON_T REL_H(SPLIT_SWAP_MORE_BTN_T_PAD) +#define MULTICALL_SPLIT_SWAP_MORE_ICON_B REL_H(SPLIT_SWAP_MORE_BTN_T_PAD+SPLIT_SWAP_MORE_BTN_HEIGHT) +/* L[HLD] + R[ACT] */ + +/* + * End of MULTI-CALL SPLIT View + */ + + +/* + * MULTI-CALL LIST View + * In Portrait mode + */ +#define MULTICALL_LIST_L REL_W(0) +#define MULTICALL_LIST_R REL_W(MAIN_SCREEN_W) +#define MULTICALL_LIST_T REL_H(CONF_LIST_T_PAD) +#define MULTICALL_LIST_B REL_H(CONF_LIST_T_PAD+CONF_LIST_HEIGHT) + +#define MULTICALL_LIST_HOLD_L REL_W(CONF_HOLD_L_PAD) +#define MULTICALL_LIST_HOLD_R REL_W(CONF_HOLD_L_PAD+CONF_HOLD_WIDTH) +#define MULTICALL_LIST_HOLD_T REL_H(CONF_HOLD_T_PAD) +#define MULTICALL_LIST_HOLD_B REL_H(CONF_HOLD_T_PAD+CONF_HOLD_HEIGHT) + +#define MULTICALL_LIST_TIMER_L REL_W(0) +#define MULTICALL_LIST_TIMER_R REL_W(MAIN_SCREEN_W) +#define MULTICALL_LIST_TIMER_T REL_H(CONF_TIMER_T_PAD) +#define MULTICALL_LIST_TIMER_B REL_H(CONF_TIMER_T_PAD+CONF_TIMER_HEIGHT) + +#define MULTICALL_LIST_BIG_END_L REL_W(CALL_BIG_END_L_PAD) +#define MULTICALL_LIST_BIG_END_R REL_W(CALL_BIG_END_L_PAD+CALL_BIG_END_WIDTH) +#define MULTICALL_LIST_BIG_END_T REL_H(CALL_BIG_END_T_PAD) +#define MULTICALL_LIST_BIG_END_B REL_H(CALL_BIG_END_T_PAD+CALL_BIG_END_HEIGHT) +/* + * End of MULTI-CALL LIST View + */ + + +/* + * SIX Button Layout + * In Portrait mode + */ +#define SIX_BTN_1_L REL_W(SIX_BTN_COL1_L_PAD) +#define SIX_BTN_1_R REL_W(SIX_BTN_COL1_L_PAD+SIX_BTN_COL1_WIDTH) +#define SIX_BTN_2_L REL_W(SIX_BTN_COL2_L_PAD) +#define SIX_BTN_2_R REL_W(SIX_BTN_COL2_L_PAD+SIX_BTN_COL1_WIDTH) +#define SIX_BTN_3_L REL_W(SIX_BTN_COL3_L_PAD) +#define SIX_BTN_3_R REL_W(SIX_BTN_COL3_L_PAD+SIX_BTN_COL1_WIDTH) + +#define SIX_BTN_1_T REL_H(SIX_BTN_ROW1_T_PAD) +#define SIX_BTN_1_B REL_H(SIX_BTN_ROW1_T_PAD+SIX_BTN_ROW1_HEIGHT) +#define SIX_BTN_2_T REL_H(SIX_BTN_ROW2_T_PAD) +#define SIX_BTN_2_B REL_H(SIX_BTN_ROW2_T_PAD+SIX_BTN_ROW1_HEIGHT) + +#define SIX_BTN_BIG_END_L REL_W(CALL_BIG_END_L_PAD) +#define SIX_BTN_BIG_END_R REL_W(CALL_BIG_END_L_PAD+CALL_BIG_END_WIDTH) +#define SIX_BTN_BIG_END_T REL_H(CALL_BIG_END_T_PAD) +#define SIX_BTN_BIG_END_B REL_H(CALL_BIG_END_T_PAD+CALL_BIG_END_HEIGHT) + +#define SIX_BTN_INCOMING_1_L SIX_BTN_BIG_END_L +#define SIX_BTN_INCOMING_1_R SIX_BTN_BIG_END_R +#define SIX_BTN_INCOMING_1_T REL_H(INCMG_CALL_BTN1_T_PAD) +#define SIX_BTN_INCOMING_1_B REL_H(INCMG_CALL_BTN1_T_PAD+INCMG_CALL_BTN_HEIGHT) + +#define SIX_BTN_INCOMING_2_L SIX_BTN_BIG_END_L +#define SIX_BTN_INCOMING_2_R SIX_BTN_BIG_END_R +#define SIX_BTN_INCOMING_2_T REL_H(INCMG_CALL_BTN2_T_PAD) +#define SIX_BTN_INCOMING_2_B REL_H(INCMG_CALL_BTN2_T_PAD+INCMG_CALL_BTN_HEIGHT) + +#define SIX_BTN_INCOMING_3_L SIX_BTN_BIG_END_L +#define SIX_BTN_INCOMING_3_R SIX_BTN_BIG_END_R +#define SIX_BTN_INCOMING_3_T REL_H(INCMG_CALL_BTN3_T_PAD) +#define SIX_BTN_INCOMING_3_B REL_H(INCMG_CALL_BTN3_T_PAD+INCMG_CALL_BTN_HEIGHT) +/* + * End of SIX Button Layout + */ + +/* + * Navigation bar layout + */ +#define CALL_NAVIGATION_BAR_T REL_H(NAVIFRAME_T_PAD) +#define CALL_NAVIGATION_BAR_B REL_H(MAIN_SCREEN_H) +#define CALL_NAVIGATION_BAR_L REL_W(0) +#define CALL_NAVIGATION_BAR_R REL_W(MAIN_SCREEN_W) +/* + * End of Navigation bar layout + */ + + +/* + * END CALL View + * In Portrait mode + */ +#define ENDSINGLECALL_BACKGROUND_CID_L DIALLING_BACKGROUND_CID_L +#define ENDSINGLECALL_BACKGROUND_CID_R DIALLING_BACKGROUND_CID_R +#define ENDSINGLECALL_BACKGROUND_CID_T DIALLING_BACKGROUND_CID_T +#define ENDSINGLECALL_BACKGROUND_CID_B DIALLING_BACKGROUND_CID_B + +#define ENDSINGLECALL_CID_L DIALLING_CID_L +#define ENDSINGLECALL_CID_R DIALLING_CID_R +#define ENDSINGLECALL_CID_T DIALLING_CID_T +#define ENDSINGLECALL_CID_B DIALLING_CID_B + +#define ENDSINGLECALL_NAME_L DIALLING_NAME_L +#define ENDSINGLECALL_NAME_R DIALLING_NAME_R +#define ENDSINGLECALL_NAME_T DIALLING_NAME_T +#define ENDSINGLECALL_NAME_B DIALLING_NAME_B + +#define ENDSINGLECALL_NUMBER_L DIALLING_NUMBER_L +#define ENDSINGLECALL_NUMBER_R DIALLING_NUMBER_R +#define ENDSINGLECALL_NUMBER_T DIALLING_NUMBER_T +#define ENDSINGLECALL_NUMBER_B DIALLING_NUMBER_B + +#define ENDSINGLECALL_TIMER_L INCALL_TIMER_L +#define ENDSINGLECALL_TIMER_R INCALL_TIMER_R +#define ENDSINGLECALL_TIMER_T INCALL_TIMER_T +#define ENDSINGLECALL_TIMER_B INCALL_TIMER_B + +#define ENDSINGLECALL_VIDEO_BTN_L REL_W(VIDEO_BTN_POS1_L_PAD) +#define ENDSINGLECALL_VIDEO_BTN_R REL_W(VIDEO_BTN_POS1_L_PAD+VIDEO_BTN_POS1_WIDTH) +#define ENDSINGLECALL_VIDEO_BTN_T REL_H(VIDEO_BTN_POS1_T_PAD) +#define ENDSINGLECALL_VIDEO_BTN_B REL_H(VIDEO_BTN_POS1_T_PAD+VIDEO_BTN_POS1_HEIGHT) + +#define ENDSINGLECALL_VIDEO2_BTN_L REL_W(VIDEO_BTN_POS2_L_PAD) +#define ENDSINGLECALL_VIDEO2_BTN_R REL_W(VIDEO_BTN_POS2_L_PAD+VIDEO_BTN_POS2_WIDTH) +#define ENDSINGLECALL_VIDEO2_BTN_T REL_H(VIDEO_BTN_POS2_T_PAD) +#define ENDSINGLECALL_VIDEO2_BTN_B REL_H(VIDEO_BTN_POS2_T_PAD+VIDEO_BTN_POS2_HEIGHT) + +#define ENDSINGLECALL_VOICE_BTN_L REL_W(VOICE_BTN_POS1_L_PAD) +#define ENDSINGLECALL_VOICE_BTN_R REL_W(VOICE_BTN_POS1_L_PAD+VOICE_BTN_POS1_WIDTH) +#define ENDSINGLECALL_VOICE_BTN_T ENDSINGLECALL_VIDEO_BTN_T +#define ENDSINGLECALL_VOICE_BTN_B ENDSINGLECALL_VIDEO_BTN_B + +#define ENDSINGLECALL_VOICE2_BTN_L ENDSINGLECALL_VOICE_BTN_L +#define ENDSINGLECALL_VOICE2_BTN_R ENDSINGLECALL_VOICE_BTN_R +#define ENDSINGLECALL_VOICE2_BTN_T ENDSINGLECALL_VIDEO2_BTN_T +#define ENDSINGLECALL_VOICE2_BTN_B ENDSINGLECALL_VIDEO2_BTN_B + +#define ENDSINGLECALL_MSG_BTN_L REL_W(MSG_BTN_POS1_L_PAD) +#define ENDSINGLECALL_MSG_BTN_R REL_W(MSG_BTN_POS1_L_PAD+MSG_BTN_POS1_WIDTH) +#define ENDSINGLECALL_MSG_BTN_T REL_H(MSG_BTN_POS1_T_PAD) +#define ENDSINGLECALL_MSG_BTN_B REL_H(MSG_BTN_POS1_T_PAD+MSG_BTN_POS1_HEIGHT) + +#define ENDSINGLECALL_MSG2_BTN_L ENDSINGLECALL_MSG_BTN_L +#define ENDSINGLECALL_MSG2_BTN_R ENDSINGLECALL_MSG_BTN_R +#define ENDSINGLECALL_MSG2_BTN_T REL_H(MSG_BTN_POS2_T_PAD) +#define ENDSINGLECALL_MSG2_BTN_B REL_H(MSG_BTN_POS2_T_PAD+MSG_BTN_POS2_HEIGHT) + +#define ENDSINGLECALL_CONTACT_BTN_L REL_W(CONTACT_BTN_POS1_L_PAD) +#define ENDSINGLECALL_CONTACT_BTN_R REL_W(CONTACT_BTN_POS1_L_PAD+CONTACT_BTN_POS1_WIDTH) +#define ENDSINGLECALL_CONTACT_BTN_T REL_H(CONTACT_BTN_POS1_T_PAD) +#define ENDSINGLECALL_CONTACT_BTN_B REL_H(CONTACT_BTN_POS1_T_PAD+CONTACT_BTN_POS1_HEIGHT) +/* + * End of END CALL View + */ +#endif /*__VCUI_VIEW_LAYOUT_WVGA__*/ diff --git a/ui/vcui-view-layout.h b/ui/vcui-view-layout.h new file mode 100755 index 0000000..b24e370 --- /dev/null +++ b/ui/vcui-view-layout.h @@ -0,0 +1,592 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VCUI_VIEW_LAYOUT__ +#define __VCUI_VIEW_LAYOUT__ + +#define COLOR_DEFAULT 0 0 0 255 +#define COLOR_BG_ALPHA 0 0 0 0 +#define COLOR_BG_FOR_HELD_CALL_DIM 0 0 0 150 + +/*#define BTN_EDGE_W 9*/ + +/*List of the screen and widget dimensions as per GUI*/ +/*Portrait mode*/ +#define MAIN_SCREEN_W 480 +#define MAIN_SCREEN_H 800 + +#define REL_W(x) (x / MAIN_SCREEN_W) +#define REL_H(x) (x / MAIN_SCREEN_H) + +/* Window layout with nothing (only indicator) */ +/* +#define WL_INDI_H 52 +#define MAIN_INDICATOR_W MAIN_SCREEN_W +#define MAIN_INDICATOR_H 748 +#define REL_INDI_W(x) (x / MAIN_INDICATOR_W) +#define REL_INDI_H(x) (x / MAIN_INDICATOR_H) +*/ + +/* Window layout with titlebar */ +/* +#define WL_TB_H 92 +#define MAIN_TITLEBAR_W MAIN_SCREEN_W +#define MAIN_TITLEBAR_H 702 +#define REL_TITLEBAR_W(x) (x / MAIN_TITLEBAR_W) +#define REL_TITLEBAR_H(x) (x / MAIN_TITLEBAR_H) +*/ + +/* Window layout with navibar */ +/*#define WL_NB_H 94*/ +#define MAIN_NAVIBAR_W MAIN_SCREEN_W +#define MAIN_NAVIBAR_H 706 +#define REL_NAVIBAR_W(x) (x / MAIN_NAVIBAR_W) +#define REL_NAVIBAR_H(x) (x / MAIN_NAVIBAR_H) + +/* Main View (MO/MT view) */ +#define DIALLING_STATUS_L REL_W(12) +#define DIALLING_STATUS_R REL_W(468) +#define DIALLING_STATUS_T REL_H(428) +#define DIALLING_STATUS_B REL_H(460) + +#define DIALLING_MT_STATUS_L REL_W(123) +#define DIALLING_MT_STATUS_R REL_W(357) +#define DIALLING_MT_STATUS_T REL_H(375) +#define DIALLING_MT_STATUS_B REL_H(407) + +#define DIALLING_NAME_L REL_W(12) +#define DIALLING_NAME_R REL_W(468) +#define DIALLING_NAME_T REL_H(52) +#define DIALLING_NAME_B REL_H(102) + +#define DIALLING_NUMBER_L DIALLING_NAME_L +#define DIALLING_NUMBER_R DIALLING_NAME_R +#define DIALLING_NUMBER_T REL_H(106) +#define DIALLING_NUMBER_B REL_H(138) + +#define DIALLING_CID_L REL_W(145) +#define DIALLING_CID_R REL_W(335) +#define DIALLING_CID_T REL_H(145) +#define DIALLING_CID_B REL_H(335) + +#define DIALLING_BACKGROUND_CID_L REL_W(0) +#define DIALLING_BACKGROUND_CID_R REL_W(MAIN_SCREEN_W) +#define DIALLING_BACKGROUND_CID_T REL_H(0) +#define DIALLING_BACKGROUND_CID_B REL_H(MAIN_SCREEN_H) + +/* accept */ +#define DIALLING_MT_BTN1_L REL_W(26) +#define DIALLING_MT_BTN1_R REL_W(228) +#define DIALLING_MT_BTN1_T REL_H(620) +#define DIALLING_MT_BTN1_B REL_H(690) + +/* reject */ +#define DIALLING_MT_BTN2_L REL_W(252) +#define DIALLING_MT_BTN2_R REL_W(454) +#define DIALLING_MT_BTN2_T DIALLING_MT_BTN1_T +#define DIALLING_MT_BTN2_B DIALLING_MT_BTN1_B +/* End of Main View (MO/MT view) */ + +/* MT LOCK View */ +#define REL_LOCK_W(x) (x / 322) +#define REL_LOCK_H(x) (x / 124) + +#define INCOMING_LOCK_ACCEPT_BG_L REL_W(-182) +#define INCOMING_LOCK_ACCEPT_BG_R REL_W(140) +#define INCOMING_LOCK_ACCEPT_BG_T REL_H(591) +#define INCOMING_LOCK_ACCEPT_BG_B REL_H(715) + +#define INCOMING_LOCK_ACCEPT_ICON_L REL_LOCK_W(202) +#define INCOMING_LOCK_ACCEPT_ICON_R REL_LOCK_W(272) +#define INCOMING_LOCK_ACCEPT_ICON_T REL_LOCK_H(23) +#define INCOMING_LOCK_ACCEPT_ICON_B REL_LOCK_H(93) + +#define INCOMING_LOCK_ACCEPT_TEXT_L REL_LOCK_W(30) +#define INCOMING_LOCK_ACCEPT_TEXT_R REL_LOCK_W(182) +#define INCOMING_LOCK_ACCEPT_TEXT_T INCOMING_LOCK_ACCEPT_ICON_T +#define INCOMING_LOCK_ACCEPT_TEXT_B INCOMING_LOCK_ACCEPT_ICON_B + +#define INCOMING_LOCK_REJECT_BG_L REL_W(340) +#define INCOMING_LOCK_REJECT_BG_R REL_W(662) +#define INCOMING_LOCK_REJECT_BG_T INCOMING_LOCK_ACCEPT_BG_T +#define INCOMING_LOCK_REJECT_BG_B INCOMING_LOCK_ACCEPT_BG_B + +#define INCOMING_LOCK_REJECT_ICON_L REL_LOCK_W(50) +#define INCOMING_LOCK_REJECT_ICON_R REL_LOCK_W(120) +#define INCOMING_LOCK_REJECT_ICON_T INCOMING_LOCK_ACCEPT_ICON_T +#define INCOMING_LOCK_REJECT_ICON_B INCOMING_LOCK_ACCEPT_ICON_B + +#define INCOMING_LOCK_REJECT_TEXT_L REL_LOCK_W(130) +#define INCOMING_LOCK_REJECT_TEXT_R REL_LOCK_W(282) +#define INCOMING_LOCK_REJECT_TEXT_T INCOMING_LOCK_REJECT_ICON_T +#define INCOMING_LOCK_REJECT_TEXT_B INCOMING_LOCK_REJECT_ICON_B + +#define REL_LOCK_MSG_W(x) (x / 232) +#define REL_LOCK_MSG_H(x) (x / 125) +/* End of MT LOCK View */ + +/* KEYPAD View */ +#define INCALL_DIALER_TIMER_T REL_H(241) +#define INCALL_DIALER_TIMER_B REL_H(271) +#define INCALL_DIALER_TIMER_L REL_W(300) +#define INCALL_DIALER_TIMER_R REL_W(454) + +#define INCALL_DIALER_NAME_T INCALL_DIALER_TIMER_T +#define INCALL_DIALER_NAME_B INCALL_DIALER_TIMER_B +#define INCALL_DIALER_NAME_L REL_W(27) +#define INCALL_DIALER_NAME_R REL_W(300) + +/* +#define DIALLING_KEYPAD_T_BF REL_H(319) +#define DIALLING_KEYPAD_B_BF REL_H(710) +*/ + +#define DIALLING_KEYPAD_T REL_H(289) +#define DIALLING_KEYPAD_B REL_H(680) +#define DIALLING_KEYPAD_L REL_W(0) +#define DIALLING_KEYPAD_R REL_W(MAIN_SCREEN_W) +#define KEYPAD_W MAIN_SCREEN_W +#define KEYPAD_H 391 + +#define DIALLING_ENTRY_TEXT_T REL_H(46) +#define DIALLING_ENTRY_TEXT_B REL_H(186) +#define DIALLING_ENTRY_TEXT_L REL_W(26) +#define DIALLING_ENTRY_TEXT_R REL_W(454) +#define REL_KEYPAD_W(x) ((x)/KEYPAD_W) +#define REL_KEYPAD_H(y) ((y)/KEYPAD_H) + +#define DIALER_BTN1_T REL_H(712) +#define DIALER_BTN1_B REL_H(782) +#define DIALER_BTN1_L REL_W(27) +#define DIALER_BTN1_R REL_W(229) + +#define DIALER_BTN2_T DIALER_BTN1_T +#define DIALER_BTN2_B DIALER_BTN1_B +#define DIALER_BTN2_L REL_W(252) +#define DIALER_BTN2_R REL_W(454) +/* End of KEYPAD View */ + +/* INCALL View : Use Windows Layout with nothing (only indicator) */ +/*Portrait view - START*/ +#define INCALL_CID_T DIALLING_CID_T +#define INCALL_CID_B DIALLING_CID_B +#define INCALL_CID_L DIALLING_CID_L +#define INCALL_CID_R DIALLING_CID_R + +/* +#define INCALL_CID_DIM_T DIALLING_CID_T +#define INCALL_CID_DIM_B DIALLING_CID_B +#define INCALL_CID_DIM_L REL_W(145) +#define INCALL_CID_DIM_R REL_W(334) +*/ + +#define INCALL_BACKGROUND_CID_L DIALLING_BACKGROUND_CID_L +#define INCALL_BACKGROUND_CID_R DIALLING_BACKGROUND_CID_R +#define INCALL_BACKGROUND_CID_T DIALLING_BACKGROUND_CID_T +#define INCALL_BACKGROUND_CID_B DIALLING_BACKGROUND_CID_B + +#define INCALL_NAME_T DIALLING_NAME_T +#define INCALL_NAME_B DIALLING_NAME_B +#define INCALL_NAME_L DIALLING_NAME_L +#define INCALL_NAME_R DIALLING_NAME_R + +#define INCALL_NUMBER_T DIALLING_NUMBER_T +#define INCALL_NUMBER_B DIALLING_NUMBER_B +#define INCALL_NUMBER_L DIALLING_NUMBER_L +#define INCALL_NUMBER_R DIALLING_NUMBER_R + +#define INCALL_HOLD_T REL_H(389) +#define INCALL_HOLD_B REL_H(443) +#define INCALL_HOLD_L REL_W(26) +#define INCALL_HOLD_R REL_W(99) + +#define INCALL_TIMER_T REL_H(400) +#define INCALL_TIMER_B REL_H(432) +#define INCALL_TIMER_L REL_W(173) +#define INCALL_TIMER_R REL_W(454) + +#define INCALL_BACKGROUND_SHARE_L REL_W(0) +#define INCALL_BACKGROUND_SHARE_R REL_W(MAIN_SCREEN_W) +#define INCALL_BACKGROUND_SHARE_T REL_H(365) +#define INCALL_BACKGROUND_SHARE_B REL_H(774) +/*Portrait view - END*/ + +/* MULTICALL_SPLIT View : Use Windows Layout with no indicator */ +/*portrait mode - START*/ +/*L[ACT] + R[HLD]*/ +#define MULTICALL_SPLIT_BACKGROUND_CID_L INCALL_BACKGROUND_CID_L +#define MULTICALL_SPLIT_BACKGROUND_CID_R INCALL_BACKGROUND_CID_R +#define MULTICALL_SPLIT_BACKGROUND_CID_T INCALL_BACKGROUND_CID_T +#define MULTICALL_SPLIT_BACKGROUND_CID_B INCALL_BACKGROUND_CID_B + +#define MULTICALL_SPLIT_CID_1_T REL_H(136) +#define MULTICALL_SPLIT_CID_1_B REL_H(326) +#define MULTICALL_SPLIT_CID_1_L REL_W(50) +#define MULTICALL_SPLIT_CID_1_R REL_W(240) + +#define MULTICALL_SPLIT_PAUSE_T REL_H(282) +#define MULTICALL_SPLIT_PAUSE_B REL_H(322) +#define MULTICALL_SPLIT_PAUSE_L REL_W(54) +#define MULTICALL_SPLIT_PAUSE_R REL_W(94) + +#define MULTICALL_SPLIT_CID_2_T REL_H(169) +#define MULTICALL_SPLIT_CID_2_B REL_H(299) +#define MULTICALL_SPLIT_CID_2_L REL_W(305) +#define MULTICALL_SPLIT_CID_2_R REL_W(435) + +#define MULTICALL_SPLIT_PLAY_T REL_H(266) +#define MULTICALL_SPLIT_PLAY_B REL_H(291) +#define MULTICALL_SPLIT_PLAY_L REL_W(313) +#define MULTICALL_SPLIT_PLAY_R REL_W(338) + +#define MULTICALL_SPLIT_NAME_1_T REL_H(90) +#define MULTICALL_SPLIT_NAME_1_B REL_H(126) +#define MULTICALL_SPLIT_NAME_1_L REL_W(24) +#define MULTICALL_SPLIT_NAME_1_R REL_W(266) + +#define MULTICALL_SPLIT_NAME_2_T REL_H(136) +#define MULTICALL_SPLIT_NAME_2_B REL_H(160) +#define MULTICALL_SPLIT_NAME_2_L REL_W(280) +#define MULTICALL_SPLIT_NAME_2_R REL_W(450) + +/* +#define MULTICALL_SPLIT_ACTIVE_ICON_T REL_H(343) +#define MULTICALL_SPLIT_ACTIVE_ICON_B REL_H(371) +#define MULTICALL_SPLIT_ACTIVE_ICON_L REL_W(97) +#define MULTICALL_SPLIT_ACTIVE_ICON_R REL_W(118) +*/ + +#define MULTICALL_SPLIT_ACTIVE_TXT_T MULTICALL_SPLIT_ACTIVE_ICON_T +#define MULTICALL_SPLIT_ACTIVE_TXT_B MULTICALL_SPLIT_ACTIVE_ICON_B +#define MULTICALL_SPLIT_ACTIVE_TXT_L REL_W(120) +#define MULTICALL_SPLIT_ACTIVE_TXT_R MULTICALL_SPLIT_CID_1_R + +#define MULTICALL_SPLIT_MORE_ICON_T REL_H(308) +#define MULTICALL_SPLIT_MORE_ICON_B REL_H(332) +#define MULTICALL_SPLIT_MORE_ICON_L REL_W(409) +#define MULTICALL_SPLIT_MORE_ICON_R REL_W(433) + +/* +#define MULTICALL_SPLIT_ON_HOLD_ICON_T REL_H(308) +#define MULTICALL_SPLIT_ON_HOLD_ICON_B REL_H(332) +#define MULTICALL_SPLIT_ON_HOLD_ICON_L REL_W(320) +#define MULTICALL_SPLIT_ON_HOLD_ICON_R REL_W(341) +*/ + +#define MULTICALL_SPLIT_ON_HOLD_TXT_T REL_H(308) +#define MULTICALL_SPLIT_ON_HOLD_TXT_B REL_H(332) +#define MULTICALL_SPLIT_ON_HOLD_TXT_L REL_W(303) +#define MULTICALL_SPLIT_ON_HOLD_TXT_R REL_W(433) + +#define MULTICALL_SPLIT_ON_HOLD_TXT_WITH_ICON_T REL_H(308) +#define MULTICALL_SPLIT_ON_HOLD_TXT_WITH_ICON_B REL_H(332) +#define MULTICALL_SPLIT_ON_HOLD_TXT_WITH_ICON_L REL_W(303) +#define MULTICALL_SPLIT_ON_HOLD_TXT_WITH_ICON_R REL_W(409) + +#define MULTICALL_SPLIT_TIMER_T REL_H(343) +#define MULTICALL_SPLIT_TIMER_B REL_H(371) +#define MULTICALL_SPLIT_TIMER_L REL_W(56) +#define MULTICALL_SPLIT_TIMER_R REL_W(246) +/*L[ACT] + R[HLD]*/ + +/*L[HLD] + R[ACT]*/ +#define MULTICALL_SPLIT_SWAP_CID_1_T MULTICALL_SPLIT_CID_2_T +#define MULTICALL_SPLIT_SWAP_CID_1_B MULTICALL_SPLIT_CID_2_B +#define MULTICALL_SPLIT_SWAP_CID_1_L REL_W(49) +#define MULTICALL_SPLIT_SWAP_CID_1_R REL_W(179) + +#define MULTICALL_SPLIT_SWAP_PLAY_T MULTICALL_SPLIT_PLAY_T +#define MULTICALL_SPLIT_SWAP_PLAY_B MULTICALL_SPLIT_PLAY_B +#define MULTICALL_SPLIT_SWAP_PLAY_L REL_W(57) +#define MULTICALL_SPLIT_SWAP_PLAY_R REL_W(82) + +#define MULTICALL_SPLIT_SWAP_CID_2_T MULTICALL_SPLIT_CID_1_T +#define MULTICALL_SPLIT_SWAP_CID_2_B MULTICALL_SPLIT_CID_1_B +#define MULTICALL_SPLIT_SWAP_CID_2_L REL_W(244) +#define MULTICALL_SPLIT_SWAP_CID_2_R REL_W(434) + +#define MULTICALL_SPLIT_SWAP_PAUSE_T MULTICALL_SPLIT_PAUSE_T +#define MULTICALL_SPLIT_SWAP_PAUSE_B MULTICALL_SPLIT_PAUSE_B +#define MULTICALL_SPLIT_SWAP_PAUSE_L REL_W(248) +#define MULTICALL_SPLIT_SWAP_PAUSE_R REL_W(288) + +#define MULTICALL_SPLIT_SWAP_NAME_1_T MULTICALL_SPLIT_NAME_2_T +#define MULTICALL_SPLIT_SWAP_NAME_1_B MULTICALL_SPLIT_NAME_2_B +#define MULTICALL_SPLIT_SWAP_NAME_1_L MULTICALL_SPLIT_NAME_1_L +#define MULTICALL_SPLIT_SWAP_NAME_1_R REL_W(194) + +#define MULTICALL_SPLIT_SWAP_NAME_2_T MULTICALL_SPLIT_NAME_1_T +#define MULTICALL_SPLIT_SWAP_NAME_2_B MULTICALL_SPLIT_NAME_1_B +#define MULTICALL_SPLIT_SWAP_NAME_2_L REL_W(208) +#define MULTICALL_SPLIT_SWAP_NAME_2_R REL_W(450) + +/* +#define MULTICALL_SPLIT_SWAP_ACTIVE_ICON_T MULTICALL_SPLIT_ACTIVE_ICON_T +#define MULTICALL_SPLIT_SWAP_ACTIVE_ICON_B MULTICALL_SPLIT_ACTIVE_ICON_B +#define MULTICALL_SPLIT_SWAP_ACTIVE_ICON_L REL_W(287) +#define MULTICALL_SPLIT_SWAP_ACTIVE_ICON_R REL_W(308) +*/ + +#define MULTICALL_SPLIT_SWAP_ACTIVE_TXT_T MULTICALL_SPLIT_ACTIVE_ICON_T +#define MULTICALL_SPLIT_SWAP_ACTIVE_TXT_B MULTICALL_SPLIT_ACTIVE_ICON_B +#define MULTICALL_SPLIT_SWAP_ACTIVE_TXT_L REL_W(310) +#define MULTICALL_SPLIT_SWAP_ACTIVE_TXT_R MULTICALL_SPLIT_SWAP_CID_2_R + +/* +#define MULTICALL_SPLIT_SWAP_ON_HOLD_ICON_T MULTICALL_SPLIT_ON_HOLD_ICON_T +#define MULTICALL_SPLIT_SWAP_ON_HOLD_ICON_B MULTICALL_SPLIT_ON_HOLD_ICON_B +#define MULTICALL_SPLIT_SWAP_ON_HOLD_ICON_L REL_W(67) +#define MULTICALL_SPLIT_SWAP_ON_HOLD_ICON_R REL_W(88) +*/ + +#define MULTICALL_SPLIT_SWAP_ON_HOLD_TXT_T REL_H(308) +#define MULTICALL_SPLIT_SWAP_ON_HOLD_TXT_B REL_H(332) +#define MULTICALL_SPLIT_SWAP_ON_HOLD_TXT_L REL_W(50) +#define MULTICALL_SPLIT_SWAP_ON_HOLD_TXT_R REL_W(180) + +#define MULTICALL_SPLIT_SWAP_MORE_ICON_T REL_H(343) +#define MULTICALL_SPLIT_SWAP_MORE_ICON_B REL_H(371) +#define MULTICALL_SPLIT_SWAP_MORE_ICON_L REL_W(412) +#define MULTICALL_SPLIT_SWAP_MORE_ICON_R REL_W(436) + +#define MULTICALL_SPLIT_SWAP_TIMER_T REL_H(343) +#define MULTICALL_SPLIT_SWAP_TIMER_B REL_H(371) +#define MULTICALL_SPLIT_SWAP_TIMER_L REL_W(246) +#define MULTICALL_SPLIT_SWAP_TIMER_R REL_W(436) + +#define MULTICALL_SPLIT_SWAP_TIMER_WITH_ICON_T REL_H(343) +#define MULTICALL_SPLIT_SWAP_TIMER_WITH_ICON_B REL_H(371) +#define MULTICALL_SPLIT_SWAP_TIMER_WITH_ICON_L REL_W(246) +#define MULTICALL_SPLIT_SWAP_TIMER_WITH_ICON_R REL_W(406) +/*L[HLD] + R[ACT]*/ +/*portrait mode - END*/ +/* End of MULTICALL_SPLIT View : Use Windows Layout with no indicator */ + +/* MULTICALL_LIST View */ +/* +#define MULTICALL_CID_T REL_TITLEBAR_H(8) +#define MULTICALL_CID_B REL_TITLEBAR_H(428) +#define MULTICALL_CID_L REL_TITLEBAR_W(15) +#define MULTICALL_CID_R REL_TITLEBAR_W(468) + +#define MULTICALL_NAME_T REL_TITLEBAR_H(218) +#define MULTICALL_NAME_B REL_TITLEBAR_H(268) + +#define MULTICALL_NUM_T REL_TITLEBAR_H(48) +#define MULTICALL_NUM_B REL_TITLEBAR_H(88) +*/ + +#define MULTICALL_LIST_T REL_H(120) +#define MULTICALL_LIST_B REL_H(475) +#define MULTICALL_LIST_L REL_W(0) +#define MULTICALL_LIST_R REL_W(MAIN_SCREEN_W) + +#define MULTICALL_LIST_HOLD_T REL_H(609) +#define MULTICALL_LIST_HOLD_B REL_H(663) +#define MULTICALL_LIST_HOLD_L REL_W(381) +#define MULTICALL_LIST_HOLD_R REL_W(454) + +#define MULTICALL_LIST_TIMER_T REL_H(620) +#define MULTICALL_LIST_TIMER_B REL_H(652) +#define MULTICALL_LIST_TIMER_L REL_W(0) +#define MULTICALL_LIST_TIMER_R REL_W(MAIN_SCREEN_W) + +#define MULTICALL_LIST_BIG_END_T REL_H(704) +#define MULTICALL_LIST_BIG_END_B REL_H(774) +#define MULTICALL_LIST_BIG_END_L REL_W(26) +#define MULTICALL_LIST_BIG_END_R REL_W(454) +/* End of MULTICALL_LIST View */ + +/* Six button layout, Without Window Layout */ +#define SIX_BTN_1_L REL_W(26) +#define SIX_BTN_1_R REL_W(160) +#define SIX_BTN_2_L REL_W(173) +#define SIX_BTN_2_R REL_W(307) +#define SIX_BTN_3_L REL_W(320) +#define SIX_BTN_3_R REL_W(454) + +#define SIX_BTN_1_T REL_H(494) +#define SIX_BTN_1_B REL_H(582) +#define SIX_BTN_2_T REL_H(595) +#define SIX_BTN_2_B REL_H(683) + +#define SIX_BTN_BIG_END_L REL_W(26) +#define SIX_BTN_BIG_END_R REL_W(454) +#define SIX_BTN_BIG_END_T REL_H(712) +#define SIX_BTN_BIG_END_B REL_H(782) + +#define SIX_BTN_INCOMING_1_L SIX_BTN_BIG_END_L +#define SIX_BTN_INCOMING_1_R SIX_BTN_BIG_END_R +#define SIX_BTN_INCOMING_1_T REL_H(438) +#define SIX_BTN_INCOMING_1_B REL_H(508) + +#define SIX_BTN_INCOMING_2_L SIX_BTN_BIG_END_L +#define SIX_BTN_INCOMING_2_R SIX_BTN_BIG_END_R +#define SIX_BTN_INCOMING_2_T REL_H(524) +#define SIX_BTN_INCOMING_2_B REL_H(594) + +#define SIX_BTN_INCOMING_3_L SIX_BTN_BIG_END_L +#define SIX_BTN_INCOMING_3_R SIX_BTN_BIG_END_R +#define SIX_BTN_INCOMING_3_T REL_H(610) +#define SIX_BTN_INCOMING_3_B REL_H(680) +/* Six Button Layout End */ + +/* Six button layout, Window Layout : INDICATOR */ +/* +#define INDI_SIX_BTN_1_L REL_INDI_W(26) +#define INDI_SIX_BTN_1_R REL_INDI_W(160) +#define INDI_SIX_BTN_2_L REL_INDI_W(173) +#define INDI_SIX_BTN_2_R REL_INDI_W(307) +#define INDI_SIX_BTN_3_L REL_INDI_W(320) +#define INDI_SIX_BTN_3_R REL_INDI_W(454) + +#define INDI_SIX_BTN_1_T_BF REL_INDI_H(417) +#define INDI_SIX_BTN_1_B_BF REL_INDI_H(505) +#define INDI_SIX_BTN_2_T_BF REL_INDI_H(518) +#define INDI_SIX_BTN_2_B_BF REL_INDI_H(606) + +#define INDI_SIX_BTN_1_T REL_INDI_H(467) +#define INDI_SIX_BTN_1_B REL_INDI_H(555) +#define INDI_SIX_BTN_2_T REL_INDI_H(568) +#define INDI_SIX_BTN_2_B REL_INDI_H(656) + +#define INDI_SIX_BTN_BIG_END_L REL_INDI_W(26) +#define INDI_SIX_BTN_BIG_END_R REL_INDI_W(454) + +#define INDI_SIX_BTN_BIG_END_T_BF REL_INDI_H(635) +#define INDI_SIX_BTN_BIG_END_B_BF REL_INDI_H(705) + +#define INDI_SIX_BTN_BIG_END_T REL_INDI_H(685) +#define INDI_SIX_BTN_BIG_END_B REL_INDI_H(755) + +#define INDI_SIX_BTN_INCOMING_1_L INDI_SIX_BTN_BIG_END_L +#define INDI_SIX_BTN_INCOMING_1_R INDI_SIX_BTN_BIG_END_R +#define INDI_SIX_BTN_INCOMING_1_T REL_INDI_H(411) +#define INDI_SIX_BTN_INCOMING_1_B REL_INDI_H(481) + +#define INDI_SIX_BTN_INCOMING_2_L INDI_SIX_BTN_BIG_END_L +#define INDI_SIX_BTN_INCOMING_2_R INDI_SIX_BTN_BIG_END_R +#define INDI_SIX_BTN_INCOMING_2_T REL_INDI_H(497) +#define INDI_SIX_BTN_INCOMING_2_B REL_INDI_H(567) + +#define INDI_SIX_BTN_INCOMING_3_L INDI_SIX_BTN_BIG_END_L +#define INDI_SIX_BTN_INCOMING_3_R INDI_SIX_BTN_BIG_END_R +#define INDI_SIX_BTN_INCOMING_3_T REL_INDI_H(583) +#define INDI_SIX_BTN_INCOMING_3_B REL_INDI_H(653) +*/ +/* Six Button Layout End */ + +/* Six button layout, Window Layout : Titlebar */ +/* +#define TITLEBAR_SIX_BTN_1_L REL_TITLEBAR_W(18) +#define TITLEBAR_SIX_BTN_1_R REL_TITLEBAR_W(160) +#define TITLEBAR_SIX_BTN_2_L REL_TITLEBAR_W(169) +#define TITLEBAR_SIX_BTN_2_R REL_TITLEBAR_W(311) +#define TITLEBAR_SIX_BTN_3_L REL_TITLEBAR_W(320) +#define TITLEBAR_SIX_BTN_3_R REL_TITLEBAR_W(462) + +#define TITLEBAR_SIX_BTN_1_T REL_TITLEBAR_H(477) +#define TITLEBAR_SIX_BTN_1_B REL_TITLEBAR_H(569) +#define TITLEBAR_SIX_BTN_2_T REL_TITLEBAR_H(580) +#define TITLEBAR_SIX_BTN_2_B REL_TITLEBAR_H(672) + +#define TITLEBAR_SIX_BTN_TXT_1_T REL_TITLEBAR_H(533) +#define TITLEBAR_SIX_BTN_TXT_1_B REL_TITLEBAR_H(562) +#define TITLEBAR_SIX_BTN_TXT_2_T REL_TITLEBAR_H(636) +#define TITLEBAR_SIX_BTN_TXT_2_B REL_TITLEBAR_H(665) + +#define TITLEBAR_SIX_BTN_TXT_1_M1_T REL_TITLEBAR_H(580) +#define TITLEBAR_SIX_BTN_TXT_1_M1_B REL_TITLEBAR_H(625) +#define TITLEBAR_SIX_BTN_TXT_1_M2_T REL_TITLEBAR_H(627) +#define TITLEBAR_SIX_BTN_TXT_1_M2_B REL_TITLEBAR_H(672) + +#define TITLEBAR_SIX_BTN_TXT_2_M1_T REL_TITLEBAR_H(477) +#define TITLEBAR_SIX_BTN_TXT_2_M1_B REL_TITLEBAR_H(569) +#define TITLEBAR_SIX_BTN_TXT_2_M2_T REL_TITLEBAR_H(580) +#define TITLEBAR_SIX_BTN_TXT_2_M2_B REL_TITLEBAR_H(672) +*/ +/* Six Button Layout End */ + +/* Navigation bar layout */ +#define CALL_NAVIGATION_BAR_T REL_H(40) +#define CALL_NAVIGATION_BAR_B REL_H(MAIN_SCREEN_H) +#define CALL_NAVIGATION_BAR_L REL_W(0) +#define CALL_NAVIGATION_BAR_R REL_W(MAIN_SCREEN_W) +/* Navigation bar layout */ + +/* End call layout */ +#define ENDSINGLECALL_BACKGROUND_CID_L DIALLING_BACKGROUND_CID_L +#define ENDSINGLECALL_BACKGROUND_CID_R DIALLING_BACKGROUND_CID_R +#define ENDSINGLECALL_BACKGROUND_CID_T DIALLING_BACKGROUND_CID_T +#define ENDSINGLECALL_BACKGROUND_CID_B DIALLING_BACKGROUND_CID_B + +#define ENDSINGLECALL_CID_L REL_W(145) +#define ENDSINGLECALL_CID_R REL_W(335) +#define ENDSINGLECALL_CID_T REL_H(145) +#define ENDSINGLECALL_CID_B REL_H(335) + +#define ENDSINGLECALL_NAME_L DIALLING_NAME_L +#define ENDSINGLECALL_NAME_R DIALLING_NAME_R +#define ENDSINGLECALL_NAME_T DIALLING_NAME_T +#define ENDSINGLECALL_NAME_B DIALLING_NAME_B + +#define ENDSINGLECALL_NUMBER_L DIALLING_NUMBER_L +#define ENDSINGLECALL_NUMBER_R DIALLING_NUMBER_R +#define ENDSINGLECALL_NUMBER_T DIALLING_NUMBER_T +#define ENDSINGLECALL_NUMBER_B DIALLING_NUMBER_B + +#define ENDSINGLECALL_TIMER_L REL_W(173) +#define ENDSINGLECALL_TIMER_R REL_W(454) +#define ENDSINGLECALL_TIMER_T REL_H(400) +#define ENDSINGLECALL_TIMER_B REL_H(432) + +#define ENDSINGLECALL_VIDEO_BTN_L REL_W(26) +#define ENDSINGLECALL_VIDEO_BTN_R REL_W(228) +#define ENDSINGLECALL_VIDEO_BTN_T REL_H(534) +#define ENDSINGLECALL_VIDEO_BTN_B REL_H(604) + +#define ENDSINGLECALL_VIDEO2_BTN_L REL_W(26) +#define ENDSINGLECALL_VIDEO2_BTN_R REL_W(228) +#define ENDSINGLECALL_VIDEO2_BTN_T REL_H(620) +#define ENDSINGLECALL_VIDEO2_BTN_B REL_H(690) + +#define ENDSINGLECALL_VOICE_BTN_L REL_W(252) +#define ENDSINGLECALL_VOICE_BTN_R REL_W(454) +#define ENDSINGLECALL_VOICE_BTN_T ENDSINGLECALL_VIDEO_BTN_T +#define ENDSINGLECALL_VOICE_BTN_B ENDSINGLECALL_VIDEO_BTN_B + +#define ENDSINGLECALL_VOICE2_BTN_L REL_W(252) +#define ENDSINGLECALL_VOICE2_BTN_R REL_W(454) +#define ENDSINGLECALL_VOICE2_BTN_T ENDSINGLECALL_VIDEO2_BTN_T +#define ENDSINGLECALL_VOICE2_BTN_B ENDSINGLECALL_VIDEO2_BTN_B + +#define ENDSINGLECALL_MSG_BTN_L REL_W(26) +#define ENDSINGLECALL_MSG_BTN_R REL_W(454) +#define ENDSINGLECALL_MSG_BTN_T REL_H(620) +#define ENDSINGLECALL_MSG_BTN_B REL_H(690) + +#define ENDSINGLECALL_MSG2_BTN_L REL_W(26) +#define ENDSINGLECALL_MSG2_BTN_R REL_W(454) +#define ENDSINGLECALL_MSG2_BTN_T REL_H(706) +#define ENDSINGLECALL_MSG2_BTN_B REL_H(776) + +#define ENDSINGLECALL_CONTACT_BTN_L REL_W(26) +#define ENDSINGLECALL_CONTACT_BTN_R REL_W(454) +#define ENDSINGLECALL_CONTACT_BTN_T REL_H(706) +#define ENDSINGLECALL_CONTACT_BTN_B REL_H(776) +/* End call layout */ + #endif /*__VCUI_VIEW_LAYOUT__*/ diff --git a/ui/vcui-view-multi-call-conf.c b/ui/vcui-view-multi-call-conf.c new file mode 100755 index 0000000..5b6c641 --- /dev/null +++ b/ui/vcui-view-multi-call-conf.c @@ -0,0 +1,241 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-view-common.h" +#include "vcui-view-elements.h" +#include "vcui-view-multi-call-conf.h" + +static int __vcui_view_multi_call_conf_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3); +static int __vcui_view_multi_call_conf_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2); +static int __vcui_view_multi_call_conf_onhide(voice_call_view_data_t *view_data); +static int __vcui_view_multi_call_conf_onshow(voice_call_view_data_t *view_data); +static int __vcui_view_multi_call_conf_ondestroy(voice_call_view_data_t *view_data); + +static voice_call_view_data_t s_view = { + .type = VIEW_INCALL_MULTICALL_CONF_VIEW, + .app_data = NULL, + .layout = NULL, + .onCreate = __vcui_view_multi_call_conf_oncreate, + .onUpdate = __vcui_view_multi_call_conf_onupdate, + .onHide = __vcui_view_multi_call_conf_onhide, + .onShow = __vcui_view_multi_call_conf_onshow, + .onDestroy = __vcui_view_multi_call_conf_ondestroy, + .priv = NULL, +}; + +voice_call_view_data_t *_vcui_view_multi_call_conf_new(vcui_app_call_data_t *ad) +{ + s_view.app_data = ad; + s_view.priv = calloc(1, sizeof(vcui_view_multi_call_conf_priv_t)); + + if (!s_view.priv) { + CALL_UI_DEBUG("ERROR!!!!!!!!!!! "); + } + + return &s_view; +} + +static void __vcui_view_multi_call_conf_draw_screen(Evas_Object *eo, void *data) +{ + CALL_UI_DEBUG(".."); + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_view_multi_call_conf_priv_t *priv = (vcui_view_multi_call_conf_priv_t *)vd->priv; + vcui_app_call_data_t *ad = vd->app_data; + char buf[DEF_BUF_LEN] = { 0, }; + call_data_t *call_data = NULL; + + priv->call_status = _vcui_doc_get_show_callstatus(); + call_data = _vcui_doc_get_last_status(priv->call_status); + if (call_data == NULL) { + CALL_UI_DEBUG("call data is null"); + return; + } + priv->total_members = _vcui_doc_get_count_hold()+_vcui_doc_get_count_unhold(); + + /* call image */ + _vcui_show_wallpaper_image(priv->contents); + priv->ic = _vcui_show_default_image(priv->contents, vd->app_data->win_main, CONF_ICON); + if (priv->call_status == CALL_HOLD) { + double scale_factor = 0.0; + scale_factor = elm_config_scale_get(); + CALL_UI_DEBUG("scale_factor %f", scale_factor); + + if (scale_factor == 1.0) { + edje_object_signal_emit(_EDJ(priv->contents), "SHOW_DIM_HD", "CID_HD"); + } else { + edje_object_signal_emit(_EDJ(priv->contents), "SHOW_DIM_WVGA", "CID_WVGA"); + } + } else { + edje_object_signal_emit(_EDJ(priv->contents), "HIDE_DIM", "CID"); + } + evas_object_smart_callback_add(priv->ic, "clicked", _vcui_conf_img_cb, vd); + + edje_object_part_text_set(_EDJ(eo), "txt_call_name", _("IDS_CALL_OPT_CONFERENCE_CALL")); + snprintf(buf, DEF_BUF_LEN, "%d %s", priv->total_members, _("IDS_CALL_BODY_PEOPLE")); + edje_object_part_text_set(_EDJ(eo), "txt_contact_phone_type", buf); /* in case of multicallconf, it is num of people */ + + _vcui_view_common_set_each_time(call_data->start_time); + + _vcui_create_top_left_button(vd); + _vcui_create_top_right_button(vd); + _vcui_create_bottom_left_button(vd); + _vcui_create_bottom_middle_button(vd); + if ((_vcui_is_phonelock_status() == EINA_TRUE)&&(_vcui_is_idle_lock() == EINA_TRUE)) { + _vcui_create_top_middle_button_disabled(vd); + _vcui_create_bottom_right_button_disabled(vd); + } else { + _vcui_create_top_middle_button(vd); + _vcui_create_bottom_right_button(vd); + } + _vcui_create_button_bigend(vd); + + ad->beffect_needed = EINA_FALSE; + + evas_object_show(eo); +} + +static Evas_Object *__vcui_view_multi_call_conf_create_contents(void *data, char *group) +{ + if (data == NULL) { + CALL_UI_DEBUG("ERROR"); + return NULL; + } + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + + Evas_Object *eo; + + /* load edje */ + eo = _vcui_load_edj(vd->app_data->win_main, EDJ_NAME, group); + if (eo == NULL) + return NULL; + + return eo; +} + +static Evas_Object *__vcui_view_multi_call_conf_create_layout_main(Evas_Object *parent) +{ + if (parent == NULL) { + CALL_UI_DEBUG("ERROR"); + return NULL; + } + + Evas_Object *ly; + ly = elm_layout_add(parent); + retvm_if(ly == NULL, NULL, "Failed elm_layout_add."); + + elm_layout_theme_set(ly, "standard", "window", "integration"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(parent, ly); + + edje_object_signal_emit(_EDJ(ly), "elm,state,show,indicator", "elm"); + edje_object_signal_emit(_EDJ(ly), "elm,state,show,content", "elm"); + evas_object_show(ly); + + return ly; +} + +static int __vcui_view_multi_call_conf_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3) +{ + voice_call_view_data_t *vd = view_data; + vcui_view_multi_call_conf_priv_t *priv = (vcui_view_multi_call_conf_priv_t *)vd->priv; + + if (!vd->layout) { + + /* Create Main Layout */ + vd->layout = __vcui_view_multi_call_conf_create_layout_main(vd->app_data->win_main); + if (vd->layout == NULL) { + CALL_UI_DEBUG("ERROR"); + return VC_ERROR; + } + /* Create Contents */ + priv->contents = __vcui_view_multi_call_conf_create_contents(vd, GRP_MULTICALL_CONF); + elm_object_part_content_set(vd->layout, "elm.swallow.content", priv->contents); + + evas_object_name_set(priv->contents, "MULTIVIEWCONF"); + CALL_UI_DEBUG("[========== MULTIVIEWCONF: priv->contents Addr : [%p] ==========]", priv->contents); + } else { + CALL_UI_DEBUG("[UI]ad->layout_multicallconf==NULL case "); + evas_object_show(vd->layout); + } + + __vcui_view_multi_call_conf_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_conf_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2) +{ + CALL_UI_DEBUG("multicall-conf view update"); + + __vcui_view_multi_call_conf_onshow(view_data); + + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_conf_onhide(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("multicall-conf view hide"); + + evas_object_hide(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_conf_onshow(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("multicall-conf view show"); + + vcui_view_multi_call_conf_priv_t *priv = (vcui_view_multi_call_conf_priv_t *)view_data->priv; + + __vcui_view_multi_call_conf_draw_screen(priv->contents, view_data); + + evas_object_hide(view_data->layout); + evas_object_show(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_conf_ondestroy(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("multicall-conf view destroy"); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + voice_call_view_data_t *vd = ad->view_st[VIEW_INCALL_MULTICALL_CONF_VIEW]; + vcui_view_multi_call_conf_priv_t *priv = (vcui_view_multi_call_conf_priv_t *)vd->priv; + + if (priv != NULL) { + if (priv->contents) { + evas_object_del(priv->contents); + priv->contents = NULL; + } + + free(priv); + priv = NULL; + } + + if (vd->layout != NULL) { + evas_object_hide(vd->layout); + evas_object_del(vd->layout); + vd->layout = NULL; + } + + ad->view_st[VIEW_INCALL_MULTICALL_CONF_VIEW] = NULL; + + _vcui_cache_flush(); + CALL_UI_DEBUG("complete destroy multi view conf"); + + return VC_NO_ERROR; +} diff --git a/ui/vcui-view-multi-call-conf.h b/ui/vcui-view-multi-call-conf.h new file mode 100755 index 0000000..65e05f1 --- /dev/null +++ b/ui/vcui-view-multi-call-conf.h @@ -0,0 +1,32 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_VIEW_MULTI_CALL_CONF_ +#define _VCUI_VIEW_MULTI_CALL_CONF_ + +typedef struct { + Evas_Object *contents; + Evas_Object *ic; + Evas_Object *record_btn; + vcui_app_call_status_t call_status; + int total_members; +} vcui_view_multi_call_conf_priv_t; + +voice_call_view_data_t *_vcui_view_multi_call_conf_new(vcui_app_call_data_t *ad); + +#endif /*_VCUI_VIEW_MULTI_CALL_CONF_*/ + diff --git a/ui/vcui-view-multi-call-list.c b/ui/vcui-view-multi-call-list.c new file mode 100755 index 0000000..f0a5485 --- /dev/null +++ b/ui/vcui-view-multi-call-list.c @@ -0,0 +1,412 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-view-elements.h" +#include "vcui-view-multi-call-list.h" + +static Elm_Genlist_Item_Class *itc_call; + +static int __vcui_view_multi_call_list_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3); +static int __vcui_view_multi_call_list_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2); +static int __vcui_view_multi_call_list_onhide(voice_call_view_data_t *view_data); +static int __vcui_view_multi_call_list_onshow(voice_call_view_data_t *view_data); +static int __vcui_view_multi_call_list_ondestroy(voice_call_view_data_t *view_data); + +static voice_call_view_data_t s_view = { + .type = VIEW_INCALL_MULTICALL_LIST_VIEW, + .app_data = NULL, + .layout = NULL, + .onCreate = __vcui_view_multi_call_list_oncreate, + .onUpdate = __vcui_view_multi_call_list_onupdate, + .onHide = __vcui_view_multi_call_list_onhide, + .onShow = __vcui_view_multi_call_list_onshow, + .onDestroy = __vcui_view_multi_call_list_ondestroy, + .priv = NULL, +}; + +voice_call_view_data_t *_vcui_view_multi_call_list_new(vcui_app_call_data_t *ad) +{ + s_view.app_data = ad; + s_view.priv = calloc(1, sizeof(vcui_view_multi_call_list_priv_t)); + + if (!s_view.priv) { + CALL_UI_DEBUG("ERROR "); + } + + return &s_view; +} + +static void __vcui_view_multi_call_list_small_end_call_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + call_data_t *call_data = data; + _vcui_engine_end_call_by_handle(call_data->call_handle); + call_data->bno_end_show = EINA_TRUE; + + _vcui_view_popup_load_endcall_time(call_data); +} + +static void __vcui_view_multi_call_list_split_call_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + call_data_t *call_data = data; + _vcui_engine_split_call(call_data->call_handle); +} + +static void __vcui_view_multi_call_list_gl_sel_call(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + + Elm_Object_Item *item = (Elm_Object_Item *)event_info; + + elm_object_item_data_get(item); + elm_genlist_item_selected_set(item, 0); +} + +static void __vcui_view_multi_call_list_gl_del_call(void *data, Evas_Object *obj) +{ + + return; +} + +static Eina_Bool __vcui_view_multi_call_list_gl_state_get_call(void *data, Evas_Object *obj, const char *part) +{ + + return EINA_FALSE; +} + +static Evas_Object *__vcui_view_multi_call_list_gl_content_get_call(void *data, Evas_Object *obj, const char *part) +{ + call_data_t *call_data = (call_data_t *)data; + + Evas_Object *icon = NULL; + Evas_Object *btn = NULL; + + if (strcmp(part, "elm.swallow.end") == 0) { + btn = elm_button_add(obj); + elm_object_style_set(btn, "style_call_smallbtn_red"); + icon = elm_icon_add(obj); + elm_icon_file_set(icon, CONF_CALL_END_ICON, NULL); + evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_icon_resizable_set(icon, 1, 1); + elm_object_part_content_set(btn, "icon", icon); + + evas_object_smart_callback_add(btn, "clicked", __vcui_view_multi_call_list_small_end_call_cb, call_data); + evas_object_propagate_events_set(btn, EINA_FALSE); + + return btn; + } else if (strcmp(part, "elm.swallow.private") == 0) { + if (_vcui_doc_get_count_hold() > 0) { + return NULL; + } + btn = elm_button_add(obj); + icon = elm_icon_add(obj); + elm_icon_file_set(icon, PRIVATE_ICON, NULL); + elm_object_style_set(btn, "icon_only/style_call_icon_only_private"); + + elm_icon_resizable_set(icon, 1, 1); + elm_object_part_content_set(btn, "icon", icon); + + evas_object_smart_callback_add(btn, "clicked", __vcui_view_multi_call_list_split_call_cb, call_data); + evas_object_propagate_events_set(btn, EINA_FALSE); + + return btn; + } + + return NULL; +} + +static char *__vcui_view_multi_call_list_gl_text_get_call(void *data, Evas_Object *obj, const char *part) +{ + char buf[DEF_BUF_LEN] = { 0, }; + call_data_t *call_data = (call_data_t *)data; + + if (strcmp(part, "elm.text") == 0) { + if (strlen((char *)call_data->call_display) == 0) + snprintf(buf, sizeof(buf), "%s", call_data->call_num); + else + snprintf(buf, sizeof(buf), "%s", call_data->call_display); + } + + return strdup(buf); +} + +static void __vcui_view_multi_call_list_genlist_init(void *data) +{ + itc_call->item_style = "multicall_list"; + itc_call->func.text_get = __vcui_view_multi_call_list_gl_text_get_call; + itc_call->func.content_get = __vcui_view_multi_call_list_gl_content_get_call; + itc_call->func.state_get = __vcui_view_multi_call_list_gl_state_get_call; + itc_call->func.del = __vcui_view_multi_call_list_gl_del_call; +} + +static void __vcui_view_multi_call_list_genlist_add(void *data) +{ + voice_call_view_data_t *vd = data; + vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)vd->priv; + Evas_Object *genlist = NULL; + + genlist = elm_genlist_add(priv->contents); + evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL); + + elm_object_part_content_set(priv->contents, "swl_calllist", genlist); + priv->multibox_gl = genlist; +} + +void __vcui_view_multi_call_list_genlist_item_append(void *data) +{ + CALL_UI_DEBUG(".."); + voice_call_view_data_t *vd = data; + vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)vd->priv; + Eina_List *list = NULL; + + if (priv->multibox_gl) { + elm_genlist_clear(priv->multibox_gl); + } + + if (priv->call_status == CALL_UNHOLD) { + list = _vcui_doc_get_unhold_caller(); + } else { + list = _vcui_doc_get_hold_caller(); + } + if (list == NULL) { + CALL_UI_DEBUG("error"); + return; + } + + Eina_List *l; + call_data_t *call_data; + EINA_LIST_FOREACH(list, l, call_data) { + elm_genlist_item_append(priv->multibox_gl, itc_call, (void *)call_data, NULL, ELM_GENLIST_ITEM_NONE, __vcui_view_multi_call_list_gl_sel_call, data); + } + eina_list_free(list); +} + +static void __vcui_view_multi_call_list_back_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + _vcui_view_auto_change(); +} + +static void __vcui_view_multi_call_list_draw_screen(void *data) +{ + CALL_UI_DEBUG(".."); + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_app_call_data_t *ad = vd->app_data; + vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)vd->priv; + call_data_t *call_data; + + priv->total_members = _vcui_doc_get_count_hold()+_vcui_doc_get_count_unhold(); + priv->call_status = _vcui_doc_get_show_callstatus(); + call_data = _vcui_doc_get_last_status(priv->call_status); + if (call_data == NULL) { + CALL_UI_DEBUG("call data is null"); + return; + } + _vcui_view_common_set_each_time(call_data->start_time); + + _vcui_show_wallpaper_image(priv->contents); + + __vcui_view_multi_call_list_genlist_item_append(vd); + + _vcui_create_conf_list_button_hold(vd); + _vcui_create_button_bigend(vd); + evas_object_show(priv->contents); +} + +static Evas_Object *__vcui_view_multi_call_list_create_contents(void *data, char *group) +{ + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + Evas_Object *eo; + + if (data == NULL) { + CALL_UI_DEBUG("ERROR"); + return NULL; + } + + /* load edje */ + eo = _vcui_load_edj(vd->layout, EDJ_NAME, group); + if (eo == NULL) + return NULL; + + return eo; +} + +static void __vcui_view_multi_call_list_create_navigationframe_layout(voice_call_view_data_t *vd) +{ + Evas_Object *navi_ly; + Evas_Object *btn1; + vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)vd->priv; + + navi_ly = _vcui_load_edj(priv->navi_frame, EDJ_NAME, "navigation_view"); + if (navi_ly == NULL) + return; + CALL_UI_DEBUG("navi_layout created..."); + + /* Load default button */ + btn1 = elm_button_add(priv->navi_frame); + elm_object_style_set(btn1, "vcui_naviframe_new_backbutton/default"); + evas_object_smart_callback_add(btn1, "clicked", __vcui_view_multi_call_list_back_cb, vd); + + elm_naviframe_item_push(priv->navi_frame, _("IDS_CALL_OPT_CONFERENCE_CALL"), btn1, NULL, navi_ly, "vcui_naviframe_new_item_1line"); +} + +static Evas_Object *__vcui_view_multi_call_list_create_navigation_layout(Evas_Object *parent) +{ + Evas_Object *navi_frame; + + if (parent == NULL) { + CALL_UI_DEBUG("ERROR"); + return NULL; + } + + navi_frame = elm_naviframe_add(parent); + elm_object_style_set(navi_frame, "vcui_naviframe_new/default"); + + return navi_frame; +} + +static Evas_Object *__vcui_view_multi_call_list_create_layout_main(Evas_Object *parent) +{ + if (parent == NULL) { + CALL_UI_DEBUG("ERROR"); + return NULL; + } + + Evas_Object *ly; + ly = elm_layout_add(parent); + retvm_if(ly == NULL, NULL, "Failed elm_layout_add."); + + elm_layout_theme_set(ly, "standard", "window", "integration"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(parent, ly); + + edje_object_signal_emit(_EDJ(ly), "elm,state,show,indicator", "elm"); + edje_object_signal_emit(_EDJ(ly), "elm,state,show,content", "elm"); + evas_object_show(ly); + + return ly; +} + +static int __vcui_view_multi_call_list_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3) +{ + CALL_UI_DEBUG("multicall-list view create"); + + voice_call_view_data_t *vd = view_data; + vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)vd->priv; + + itc_call = elm_genlist_item_class_new(); + + if (!vd->layout) { + vd->layout = __vcui_view_multi_call_list_create_layout_main(vd->app_data->win_main); + if (vd->layout == NULL) { + CALL_UI_DEBUG("ERROR"); + return VC_ERROR; + } + priv->contents = __vcui_view_multi_call_list_create_contents(vd, GRP_MULTICALL); + elm_object_part_content_set(vd->layout, "elm.swallow.content", priv->contents); + + priv->navi_frame = __vcui_view_multi_call_list_create_navigation_layout(vd->layout); + elm_object_part_content_set(priv->contents, "navigation_bar", priv->navi_frame); + + __vcui_view_multi_call_list_create_navigationframe_layout(vd); + + evas_object_name_set(priv->contents, "MULTIVIEWLIST"); + CALL_UI_DEBUG("[========== MULTIVIEWLIST: priv->contents Addr : [%p] ==========]", priv->contents); + + __vcui_view_multi_call_list_genlist_add(vd); + __vcui_view_multi_call_list_genlist_init(vd); + } else { + CALL_UI_DEBUG("[UI]ad->layout_multicall != NULL case "); + evas_object_show(vd->layout); + } + + __vcui_view_multi_call_list_onshow(view_data); + + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_list_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2) +{ + CALL_UI_DEBUG("multicall-list view update"); + + __vcui_view_multi_call_list_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_list_onhide(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("multicall-list view hide"); + + evas_object_hide(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_list_onshow(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("multicall-list view show"); + + __vcui_view_multi_call_list_draw_screen(view_data); + + evas_object_hide(view_data->layout); + evas_object_show(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_list_ondestroy(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("multicall-list view destroy"); + + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + voice_call_view_data_t *vd = ad->view_st[VIEW_INCALL_MULTICALL_LIST_VIEW]; + vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)vd->priv; + + if (itc_call) + elm_genlist_item_class_free(itc_call); + + if (priv != NULL) { + if (priv->multibox_gl != NULL) { + elm_genlist_clear(priv->multibox_gl); + evas_object_del(priv->multibox_gl); + priv->multibox_gl = NULL; + } + + if (priv->contents) { + evas_object_del(priv->contents); + priv->contents = NULL; + } + + free(priv); + priv = NULL; + } + + if (vd->layout != NULL) { + evas_object_hide(vd->layout); + evas_object_del(vd->layout); + vd->layout = NULL; + } + + ad->view_st[VIEW_INCALL_MULTICALL_LIST_VIEW] = NULL; + + _vcui_cache_flush(); + CALL_UI_DEBUG("complete destroy multi view list"); + return VC_NO_ERROR; +} diff --git a/ui/vcui-view-multi-call-list.h b/ui/vcui-view-multi-call-list.h new file mode 100755 index 0000000..1561a93 --- /dev/null +++ b/ui/vcui-view-multi-call-list.h @@ -0,0 +1,38 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_VIEW_MULTI_CALL_LIST_ +#define _VCUI_VIEW_MULTI_CALL_LIST_ + +typedef struct { + Evas_Object *navi_frame; + Evas_Object *contents; + + Evas_Object *ic; + + Evas_Object *record_btn; + + vcui_app_call_status_t call_status; + + Evas_Object *multibox_gl; + + int total_members; +} vcui_view_multi_call_list_priv_t; + +#endif + +voice_call_view_data_t *_vcui_view_multi_call_list_new(vcui_app_call_data_t *ad); diff --git a/ui/vcui-view-multi-call-split.c b/ui/vcui-view-multi-call-split.c new file mode 100755 index 0000000..653fa7d --- /dev/null +++ b/ui/vcui-view-multi-call-split.c @@ -0,0 +1,402 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-view-elements.h" +#include "vcui-view-multi-call-split.h" + +static int __vcui_view_multi_call_split_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3); +static int __vcui_view_multi_call_split_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2); +static int __vcui_view_multi_call_split_onhide(voice_call_view_data_t *view_data); +static int __vcui_view_multi_call_split_onshow(voice_call_view_data_t *view_data); +static int __vcui_view_multi_call_split_ondestroy(voice_call_view_data_t *view_data); + +static voice_call_view_data_t s_view = { + .type = VIEW_INCALL_MULTICALL_SPLIT_VIEW, + .app_data = NULL, + .layout = NULL, + .onCreate = __vcui_view_multi_call_split_oncreate, + .onUpdate = __vcui_view_multi_call_split_onupdate, + .onHide = __vcui_view_multi_call_split_onhide, + .onShow = __vcui_view_multi_call_split_onshow, + .onDestroy = __vcui_view_multi_call_split_ondestroy, + .priv = NULL, +}; + +voice_call_view_data_t *_vcui_view_multi_call_split_new(vcui_app_call_data_t *ad) +{ + s_view.app_data = ad; + s_view.priv = calloc(1, sizeof(incall_multi_view_split_priv_t)); + + if (!s_view.priv) { + CALL_UI_DEBUG("ERROR!!!!!!!!!!!"); + } + + return &s_view; +} + +static void __vcui_more_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + _vcui_view_change(VIEW_INCALL_MULTICALL_LIST_VIEW, 0, 0, 0); +} + +static void __vcui_view_multi_call_split_draw_screen(Evas_Object *eo, void *data) +{ + CALL_UI_DEBUG(".."); + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incall_multi_view_split_priv_t *priv = (incall_multi_view_split_priv_t *)vd->priv; + + vcui_app_call_data_t *ad = vd->app_data; + + Evas_Object *sw1; + Evas_Object *sw2; + Evas_Object *sw3; + Evas_Object *sw4; + Evas_Object *play_ic; + Evas_Object *pause_ic; + Evas_Object *more_ic; + + priv->now_data_hold = _vcui_doc_get_last_status(CALL_HOLD); + priv->now_data_unhold = _vcui_doc_get_last_status(CALL_UNHOLD); + + if ((priv->now_data_hold == NULL) || (priv->now_data_unhold == NULL)) { + CALL_UI_DEBUG("call data is null"); + return; + } + + sw1 = edje_object_part_swallow_get(_EDJ(eo), "swl_cid_1"); + if (sw1) { + edje_object_part_unswallow(_EDJ(eo), sw1); + evas_object_del(sw1); + } + sw2 = edje_object_part_swallow_get(_EDJ(eo), "swl_cid_2"); + if (sw2) { + edje_object_part_unswallow(_EDJ(eo), sw2); + evas_object_del(sw2); + } + sw3 = edje_object_part_swallow_get(_EDJ(eo), "txt_call_name_1"); + if (sw3) { + edje_object_part_unswallow(_EDJ(eo), sw3); + evas_object_del(sw3); + } + sw4 = edje_object_part_swallow_get(_EDJ(eo), "txt_call_name_2"); + if (sw4) { + edje_object_part_unswallow(_EDJ(eo), sw4); + evas_object_del(sw4); + } + play_ic = edje_object_part_swallow_get(_EDJ(eo), "swl_play"); + if (play_ic) { + edje_object_part_unswallow(_EDJ(eo), play_ic); + evas_object_del(play_ic); + } + pause_ic = edje_object_part_swallow_get(_EDJ(eo), "swl_pause"); + if (pause_ic) { + edje_object_part_unswallow(_EDJ(eo), pause_ic); + evas_object_del(pause_ic); + } + more_ic = edje_object_part_swallow_get(_EDJ(eo), "swl_more"); + if (more_ic) { + edje_object_part_unswallow(_EDJ(eo), more_ic); + evas_object_del(more_ic); + } + + priv->ic_incall = elm_icon_add(vd->app_data->win_main); + elm_object_part_content_set(eo, "swl_cid_1", priv->ic_incall); + + priv->ic_onhold = elm_icon_add(vd->app_data->win_main); + elm_object_part_content_set(eo, "swl_cid_2", priv->ic_onhold); + + play_ic = elm_icon_add(vd->app_data->win_main); + elm_object_part_content_set(eo, "swl_play", play_ic); + pause_ic = elm_icon_add(vd->app_data->win_main); + elm_object_part_content_set(eo, "swl_pause", pause_ic); + more_ic = elm_icon_add(vd->app_data->win_main); + elm_object_part_content_set(eo, "swl_more", more_ic); + + CALL_UI_DEBUG("priv->now_data_unhold->call_num:[%s]", priv->now_data_unhold->call_num); + CALL_UI_DEBUG("priv->now_data_hold->call_num:[%s]", priv->now_data_hold->call_num); + CALL_UI_DEBUG("priv->now_data_unhold->call_file_path:[%s]", priv->now_data_unhold->call_file_path); + CALL_UI_DEBUG("priv->now_data_hold->call_file_path:[%s]", priv->now_data_hold->call_file_path); + + _vcui_show_wallpaper_image(priv->contents); + if (_vcui_doc_get_count_unhold() == 1 && _vcui_doc_get_count_hold() == 1) { + /* in call */ + elm_icon_file_set(priv->ic_incall, (char *)priv->now_data_unhold->call_file_path, NULL); + + if (strlen((char *)priv->now_data_unhold->call_display) == 0) { + edje_object_part_text_set(_EDJ(eo), "txt_call_name_1", (char *)priv->now_data_unhold->call_num); + } else { + edje_object_part_text_set(_EDJ(eo), "txt_call_name_1", (char *)priv->now_data_unhold->call_display); + } + + /* on hold */ + elm_icon_file_set(priv->ic_onhold, (char *)priv->now_data_hold->call_file_path, NULL); + + if (strlen((char *)priv->now_data_hold->call_display) == 0) { + edje_object_part_text_set(_EDJ(eo), "txt_call_name_2", (char *)priv->now_data_hold->call_num); + } else { + edje_object_part_text_set(_EDJ(eo), "txt_call_name_2", (char *)priv->now_data_hold->call_display); + } + + /* on hold callback */ + if (priv->ic_onhold) { + evas_object_smart_callback_del(priv->ic_onhold, "clicked", _vcui_swap_btn_cb); + } + evas_object_smart_callback_add(priv->ic_onhold, "clicked", _vcui_swap_btn_cb, vd); + } else if (_vcui_doc_get_count_unhold() == 1 && _vcui_doc_get_count_hold() > 1) { + /* in call */ + elm_icon_file_set(priv->ic_incall, (char *)priv->now_data_unhold->call_file_path, NULL); + + if (strlen((char *)priv->now_data_unhold->call_display) == 0) { + edje_object_part_text_set(_EDJ(eo), "txt_call_name_1", (char *)priv->now_data_unhold->call_num); + } else { + edje_object_part_text_set(_EDJ(eo), "txt_call_name_1", (char *)priv->now_data_unhold->call_display); + } + + /* on hold */ + elm_icon_file_set(priv->ic_onhold, CONF_ICON, NULL); + edje_object_part_text_set(_EDJ(eo), "txt_call_name_2", _("IDS_CALL_OPT_CONFERENCE_CALL")); + + /* on hold callback */ + if (priv->ic_onhold) { + evas_object_smart_callback_del(priv->ic_onhold, "clicked", _vcui_swap_btn_cb); + } + evas_object_smart_callback_add(priv->ic_onhold, "clicked", _vcui_swap_btn_cb, vd); + } else if (_vcui_doc_get_count_unhold() > 1 && _vcui_doc_get_count_hold() == 1) { + /* in call */ + elm_icon_file_set(priv->ic_incall, CONF_ICON, NULL); + edje_object_part_text_set(_EDJ(eo), "txt_call_name_1", _("IDS_CALL_OPT_CONFERENCE_CALL")); + + /* on hold */ + elm_icon_file_set(priv->ic_onhold, (char *)priv->now_data_hold->call_file_path, NULL); + + if (strlen((char *)priv->now_data_hold->call_display) == 0) { + edje_object_part_text_set(_EDJ(eo), "txt_call_name_2", (char *)priv->now_data_hold->call_num); + } else { + edje_object_part_text_set(_EDJ(eo), "txt_call_name_2", (char *)priv->now_data_hold->call_display); + } + + /* on hold callback */ + if (priv->ic_onhold) { + evas_object_smart_callback_del(priv->ic_onhold, "clicked", _vcui_swap_btn_cb); + } + evas_object_smart_callback_add(priv->ic_onhold, "clicked", _vcui_swap_btn_cb, vd); + + /* enter conf list view */ + if (priv->ic_incall) { + evas_object_smart_callback_del(priv->ic_incall, "clicked", _vcui_conf_img_cb); + } + evas_object_smart_callback_add(priv->ic_incall, "clicked", _vcui_conf_img_cb, vd); + } else { + CALL_UI_DEBUG("[=========== ERROR : Invalid Status!!! ============]"); + return; + } + + elm_icon_file_set(play_ic, PLAY_ICON, NULL); + elm_icon_file_set(pause_ic, PAUSE_ICON, NULL); + + elm_icon_file_set(more_ic, MORE_ICON, NULL); + evas_object_smart_callback_add(more_ic, "clicked", __vcui_more_btn_cb, vd); + + _vcui_view_common_set_each_time(priv->now_data_unhold->start_time); + + edje_object_part_text_set(_EDJ(eo), "txt_onhold", _("IDS_CALL_BODY_ON_HOLD_ABB")); + + if ((_vcui_doc_get_count_unhold() == 5 && _vcui_doc_get_count_hold() == 1) || (_vcui_doc_get_count_unhold() == 1 && _vcui_doc_get_count_hold() == 5)) { + _vcui_create_top_right_button_disabled(vd); + } else { + _vcui_create_top_right_button(vd); + } + + _vcui_create_top_left_button(vd); + _vcui_create_bottom_left_button(vd); + _vcui_create_bottom_middle_button(vd); + if ((_vcui_is_phonelock_status() == EINA_TRUE)&&(_vcui_is_idle_lock() == EINA_TRUE)) { + _vcui_create_top_middle_button_disabled(vd); + _vcui_create_bottom_right_button_disabled(vd); + } else { + _vcui_create_top_middle_button(vd); + _vcui_create_bottom_right_button(vd); + } + _vcui_create_button_bigend(vd); + + ad->beffect_needed = EINA_FALSE; + + evas_object_show(eo); +} + +static Evas_Object *__vcui_view_multi_call_split_create_contents(void *data, char *group) +{ + if (data == NULL) { + CALL_UI_DEBUG("ERROR"); + return NULL; + } + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + + Evas_Object *eo = NULL; + + /* load edje */ + eo = _vcui_load_edj(vd->app_data->win_main, EDJ_NAME, group); + if (eo == NULL) + return NULL; + + return eo; +} + +static Evas_Object *__vcui_view_multi_call_split_create_layout_main(Evas_Object *parent) +{ + if (parent == NULL) { + CALL_UI_DEBUG("ERROR"); + return NULL; + } + + Evas_Object *ly; + ly = elm_layout_add(parent); + retvm_if(ly == NULL, NULL, "Failed elm_layout_add."); + + elm_layout_theme_set(ly, "standard", "window", "integration"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(parent, ly); + + edje_object_signal_emit(_EDJ(ly), "elm,state,show,indicator", "elm"); + edje_object_signal_emit(_EDJ(ly), "elm,state,show,content", "elm"); + evas_object_show(ly); + + return ly; +} + +static int __vcui_view_multi_call_split_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3) +{ + CALL_UI_DEBUG("multi-split view create"); + + voice_call_view_data_t *vd = view_data; + vcui_app_call_data_t *ad = vd->app_data; + + if (!vd->layout) { + vd->layout = __vcui_view_multi_call_split_create_layout_main(vd->app_data->win_main); + if (vd->layout == NULL) { + CALL_UI_DEBUG("ERROR"); + return VC_ERROR; + } + } else { + CALL_UI_DEBUG("[UI]ad->layout_incall==NULL case "); + evas_object_show(vd->layout); + } + + __vcui_view_multi_call_split_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_split_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2) +{ + CALL_UI_DEBUG("multi-split view update"); + + __vcui_view_multi_call_split_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_split_onhide(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("multi-split view hide"); + + evas_object_hide(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_split_onshow(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("multi-split view show"); + + incall_multi_view_split_priv_t *priv = (incall_multi_view_split_priv_t *)view_data->priv; + vcui_app_call_data_t *ad = view_data->app_data; + + if (priv->contents) { + evas_object_del(priv->contents); + priv->contents = NULL; + } + + CALL_UI_DEBUG("bswapped(%d)",ad->bswapped); + if (ad->bswapped == 1) { + priv->contents = __vcui_view_multi_call_split_create_contents(view_data, GRP_MULTICALL_SPLIT2); + } else { + priv->contents = __vcui_view_multi_call_split_create_contents(view_data, GRP_MULTICALL_SPLIT); + } + elm_object_part_content_set(view_data->layout, "elm.swallow.content", priv->contents); + evas_object_name_set(priv->contents, "MULTIVIEWSPLIT"); + CALL_UI_DEBUG("[========== MULTIVIEWSPLIT: priv->contents Addr : [%p] ==========]", priv->contents); + + __vcui_view_multi_call_split_draw_screen(priv->contents, view_data); + + evas_object_hide(view_data->layout); + + double scale_factor = 0.0; + if (ad->bswapped == 1) { + edje_object_signal_emit(_EDJ(priv->contents), "set-portrait", "incall-split2-view"); + if (_vcui_doc_get_count_unhold() > 1 && _vcui_doc_get_count_hold() == 1) { + CALL_UI_DEBUG("show-more-portrait mode signal emit"); + edje_object_signal_emit(_EDJ(priv->contents), "show-more-portrait", "incall-split2-conf-call"); + } + } + else { + edje_object_signal_emit(_EDJ(priv->contents), "set-portrait", "incall-split1-view"); + if (_vcui_doc_get_count_hold() > 1 && _vcui_doc_get_count_unhold() == 1) { + CALL_UI_DEBUG("show-more-portrait mode signal emit"); + edje_object_signal_emit(_EDJ(priv->contents), "show-more-portrait", "incall-split1-conf-call"); + } + } + + scale_factor = elm_config_scale_get(); + CALL_UI_DEBUG("scale_factor %f", scale_factor); + if (scale_factor == 1.0) { + edje_object_signal_emit(_EDJ(priv->contents), "show-swl-dim-hd", "cid-hd"); + } else { + edje_object_signal_emit(_EDJ(priv->contents), "show-swl-dim-wvga", "cid-wvga"); + } + evas_object_show(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_split_ondestroy(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("multi-split view destroy"); + + vcui_app_call_data_t *ad = _vcui_get_app_data(); + voice_call_view_data_t *vd = ad->view_st[VIEW_INCALL_MULTICALL_SPLIT_VIEW]; + + incall_multi_view_split_priv_t *priv = (incall_multi_view_split_priv_t *)vd->priv; + if (priv != NULL) { + if (priv->contents) { + evas_object_del(priv->contents); + priv->contents = NULL; + } + free(priv); + priv = NULL; + } + + if (vd->layout != NULL) { + evas_object_hide(vd->layout); + evas_object_del(vd->layout); + vd->layout = NULL; + } + ad->view_st[VIEW_INCALL_MULTICALL_SPLIT_VIEW] = NULL; + + _vcui_cache_flush(); + + return VC_NO_ERROR; +} diff --git a/ui/vcui-view-multi-call-split.h b/ui/vcui-view-multi-call-split.h new file mode 100755 index 0000000..39b2750 --- /dev/null +++ b/ui/vcui-view-multi-call-split.h @@ -0,0 +1,36 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VOICE_CALL_UI_INCALL_MULTI_VIEW_SPLIT_ +#define _VOICE_CALL_UI_INCALL_MULTI_VIEW_SPLIT_ + +typedef struct { + Evas_Object *contents; + + Evas_Object *ic_incall; + Evas_Object *ic_onhold; + + Evas_Object *record_btn; + + call_data_t *now_data_hold; + call_data_t *now_data_unhold; + +} incall_multi_view_split_priv_t; + +voice_call_view_data_t *_vcui_view_multi_call_split_new(vcui_app_call_data_t *ad); +#endif + diff --git a/ui/vcui-view-popup.c b/ui/vcui-view-popup.c new file mode 100755 index 0000000..fe663b9 --- /dev/null +++ b/ui/vcui-view-popup.c @@ -0,0 +1,899 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-engine-interface.h" +#include "vcui-view-popup.h" +#include "vcui-view-multi-call-split.h" +#include "vcui-view-multi-call-conf.h" +#include "vcui-view-multi-call-list.h" +#include "vcui-view-single-call.h" +#include "vcui-view-common.h" + #define VCONFKEY_BT_HEADSET_NAME "memory/bluetooth/sco_headset_name" + +#define TICKER_TIMEOUT 2 +static void __vcui_view_popup_response_cb_vol_voice(void *data, Evas_Object *obj, void *event_info); + +static void __vcui_view_popup_win_del(void *data) +{ + CALL_UI_DEBUG(".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + CALL_UI_DEBUG("delete the popup main_win - if created..."); + if (ad->popup_mw != NULL) { + CALL_UI_DEBUG("main_win is NOT null"); + evas_object_del(ad->popup_mw); + ad->popup_mw = NULL; + } +} + +void _vcui_view_popup_unload(Evas_Object *popup_eo) +{ + CALL_UI_DEBUG(".."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + if (popup_eo) { + evas_object_hide(popup_eo); + evas_object_del(popup_eo); + popup_eo = NULL; + } + + __vcui_view_popup_win_del(ad); + _vcui_cache_flush(); + + return; +} + +static void __vcui_view_popup_response_cb_terminate(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + if (ad->popup_eo) { + CALL_UI_DEBUG("popup eo delete."); + evas_object_hide(ad->popup_eo); + evas_object_del(ad->popup_eo); + ad->popup_eo = NULL; + } + _vcui_cache_flush(); + __vcui_view_popup_win_del(ad); + + _vcui_view_common_call_terminate_or_view_change(); + + return; +} + +static void __vcui_view_popup_response_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + if (ad->popup_eo) { + CALL_UI_DEBUG("popup eo delete."); + evas_object_hide(ad->popup_eo); + evas_object_del(ad->popup_eo); + ad->popup_eo = NULL; + } + _vcui_cache_flush(); + __vcui_view_popup_win_del(ad); + return; +} + +/* create a separate main window for the popups with a high priority */ +/* this window will always be displayed on top, even on a lock screen */ +static Evas_Object *__vcui_view_popup_create_win(vcui_app_call_data_t *ad, const char *name) +{ + CALL_UI_DEBUG(".."); + Ecore_X_Window xwin; + Evas_Object *eo; + int w, h; + + CALL_UI_DEBUG("create the popup main_win..."); + eo = elm_win_add(NULL, name, ELM_WIN_DIALOG_BASIC); + if (eo) { + elm_win_alpha_set(eo, EINA_TRUE); + elm_win_title_set(eo, name); + elm_win_borderless_set(eo, EINA_TRUE); + elm_win_raise(eo); + ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h); + evas_object_resize(eo, w, h); + + /* Set the popup window type as LEVEL-HIGH so it is always displayed on top */ + CALL_UI_DEBUG("...Set HIGH priority..."); + xwin = elm_win_xwindow_get(eo); + ecore_x_netwm_window_type_set(xwin, ECORE_X_WINDOW_TYPE_NOTIFICATION); + utilx_set_system_notification_level(ecore_x_display_get(), xwin, UTILX_NOTIFICATION_LEVEL_HIGH); + + evas_object_show(eo); + } + + return eo; +} + +void _vcui_view_popup_load(char *popup_msg, double time_out, int bterminate) +{ + CALL_UI_DEBUG("msg:[%s], bterminate:[%d]", popup_msg, bterminate); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + if (popup_msg == NULL) { + return; + } + + _vcui_view_popup_unload(ad->popup_eo); + +#ifdef CALL_MW + if (ad->bwin_top) { + CALL_UI_DEBUG("parent window TOP"); + ad->popup_eo = elm_popup_add(ad->win_main); + _vcui_show_main_ui_set_flag(); + } else +#endif + { + ad->popup_mw = __vcui_view_popup_create_win(ad, "base"); + ad->popup_eo = elm_popup_add(ad->popup_mw); + } + evas_object_size_hint_weight_set(ad->popup_eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(ad->popup_eo, popup_msg); + elm_popup_timeout_set(ad->popup_eo, time_out); + if (bterminate == 0) { + evas_object_smart_callback_add(ad->popup_eo, "timeout", __vcui_view_popup_response_cb, ad); + } else { + evas_object_smart_callback_add(ad->popup_eo, "timeout", __vcui_view_popup_response_cb_terminate, ad); + } + evas_object_show(ad->popup_eo); +} + +void _vcui_view_popup_replace(char *popup_msg, double time_out, int bterminate) +{ + CALL_UI_DEBUG("msg:[%s], bterminate:[%d]", popup_msg, bterminate); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + if (ad->popup_eo == NULL) { + _vcui_view_popup_load(popup_msg, time_out, bterminate); + } else { + if (popup_msg == NULL) { + return; + } + + if (ad->view_top != -1) { +#ifdef CALL_MW + _vcui_raise_main_win(); +#else + if (ad->popup_mw != NULL) + elm_win_activate(ad->popup_mw); +#endif + } + + elm_object_text_set(ad->popup_eo, popup_msg); + elm_popup_timeout_set(ad->popup_eo, time_out); + if (bterminate == 0) { + evas_object_smart_callback_add(ad->popup_eo, "timeout", __vcui_view_popup_response_cb, ad); + } else { + evas_object_smart_callback_add(ad->popup_eo, "timeout", __vcui_view_popup_response_cb_terminate, ad); + } + evas_object_show(ad->popup_eo); + } +} + +void _vcui_view_popup_load_reject_call(char *name, char *number, int end_app) +{ + CALL_UI_DEBUG(".."); + char msg[DEF_BUF_LEN_LONG] = { 0, }; + + if (strlen(name) == 0) { + snprintf(msg, sizeof(msg), "%s
%s", number, _("IDS_CALL_POP_REJECTED")); + } else if (strlen(number) == 0) { + snprintf(msg, sizeof(msg), "%s
%s", name, _("IDS_CALL_POP_REJECTED")); + } else { + snprintf(msg, sizeof(msg), "%s
%s
%s", name, number, _("IDS_CALL_POP_REJECTED")); + } + + _vcui_view_popup_load(msg, POPUP_TIMEOUT_LONG, end_app); + +} + +void _vcui_view_popup_load_endcall_time(call_data_t *cd) +{ + unsigned long sec = 0; + unsigned long min = 0; + unsigned long hr = 0; + unsigned long call_duration_in_sec = _vcui_get_diff_now(cd->start_time); + char buf[DEF_BUF_LEN] = { 0, }; + char msg[DEF_BUF_LEN_LONG] = { 0, }; + + sec = call_duration_in_sec % 60; + min = (call_duration_in_sec / 60) % 60; + hr = call_duration_in_sec / 3600; + snprintf(buf, sizeof(buf), "%c%c:%c%c:%c%c", (int)((hr / 10) + '0'), (int)((hr % 10) + '0'), (int)((min / 10) + '0'), (int)((min % 10) + '0'), (int)((sec / 10) + '0'), (int)((sec % 10) + '0')); + + snprintf(msg, sizeof(msg), "%s
%s
%s", cd->call_display, cd->call_num, buf); + + _vcui_view_popup_load(msg, POPUP_TIMEOUT_SHORT, EINA_FALSE); +} + +void _vcui_view_popup_load_redial(void) +{ + _vcui_view_popup_load(_("IDS_CALL_POP_REDIALLING"), POPUP_TIMEOUT_NORMAL, EINA_FALSE); +} + +static Eina_Bool __vcui_view_popup_timer_cb_vol_ringtone(void *data) +{ + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + ad->vol_ringtone_popup_del_timer = NULL; + return ECORE_CALLBACK_CANCEL; +} + +static void __vcui_view_popup_vol_update_icon(int volume_level) +{ + CALL_UI_DEBUG("..."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + Evas_Object *icon = NULL; + + icon = edje_object_part_swallow_get(_EDJ(ad->popup_vol_ly), "volume_icon"); + if (icon) { + edje_object_part_unswallow(_EDJ(ad->popup_vol_ly), icon); + evas_object_del(icon); + } + + icon = elm_icon_add(ad->popup_vol_ly); + evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_icon_resizable_set(icon, 0, 0); + elm_object_part_content_set(ad->popup_vol_ly, "volume_icon", icon); + if (volume_level == 0) + elm_icon_file_set(icon, VOLUME_MUTE_ICON, NULL); + else + elm_icon_file_set(icon, VOLUME_ICON, NULL); +} + +static void __vcui_view_popup_vol_ringtone_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + double value; + + value = elm_slider_value_get(obj); + if (value > RINGTONE_MAX) + value = RINGTONE_MAX; + else if (value < RINGTONE_MIN) + value = RINGTONE_MIN; + + ad->ringtone_val = (int)value; + + _vcui_engine_set_volume_level(VCUI_VOL_RING, ad->ringtone_val); + + elm_slider_value_set(obj, ad->ringtone_val); + if (ad->vol_ringtone_popup_del_timer) { + ecore_timer_del(ad->vol_ringtone_popup_del_timer); + ad->vol_ringtone_popup_del_timer = NULL; + } + + CALL_UI_DEBUG("ad->ringtone_val %d...", ad->ringtone_val); + __vcui_view_popup_vol_update_icon(ad->ringtone_val); + ad->vol_ringtone_popup_del_timer = ecore_timer_add(POPUP_TIMEOUT_SHORT, __vcui_view_popup_timer_cb_vol_ringtone, ad); +} + +static void __vcui_view_popup_response_cb_vol_ringtone(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + if (ad->vol_ringtone_popup_eo) { + CALL_UI_DEBUG("vol_ringtone_popup_eo delete."); + evas_object_del(ad->vol_ringtone_popup_eo); + ad->vol_ringtone_popup_eo = NULL; + } + + ad->vol_longpress_cnt = 0; + + if (ad->volup_key_longpress_timer) { + ecore_timer_del(ad->volup_key_longpress_timer); + ad->volup_key_longpress_timer = NULL; + } + + if (ad->voldown_key_longpress_timer) { + ecore_timer_del(ad->voldown_key_longpress_timer); + ad->voldown_key_longpress_timer = NULL; + } + + _vcui_cache_flush(); + __vcui_view_popup_win_del(ad); + return; +} + +void _vcui_view_popup_vol_ringtone(int vol_level) +{ + CALL_UI_DEBUG("vol_level(%d)", vol_level); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + Evas_Object *popup = NULL; + Evas_Object *slider = NULL; + Evas_Object *icon = NULL; + + if (ad->vol_ringtone_popup_eo) { + __vcui_view_popup_vol_update_icon(vol_level); + elm_slider_value_set(ad->vol_ringtone_slider_eo, vol_level); + if (ad->vol_ringtone_popup_del_timer) { + ecore_timer_del(ad->vol_ringtone_popup_del_timer); + ad->vol_ringtone_popup_del_timer = NULL; + } + ad->vol_ringtone_popup_del_timer = ecore_timer_add(POPUP_TIMEOUT_SHORT, __vcui_view_popup_timer_cb_vol_ringtone, ad); + } else { +#ifdef CALL_MW + popup = elm_popup_add(ad->win_main); +#else + ad->popup_mw = __vcui_view_popup_create_win(ad, "base"); + ad->vol_ringtone_popup_eo = popup = elm_popup_add(ad->popup_mw); +#endif + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_text_set(popup, "title,text", dgettext("sys_string", "IDS_COM_BODY_RINGTONE")); + + ad->popup_vol_ly = _vcui_load_edj(popup, EDJ_NAME, "volume"); + if (ad->popup_vol_ly == NULL) { + if (ad->vol_ringtone_popup_eo) { + CALL_UI_DEBUG("vol_ringtone_popup_eo delete."); + evas_object_del(ad->vol_ringtone_popup_eo); + ad->vol_ringtone_popup_eo = NULL; + } + __vcui_view_popup_win_del(ad); + return; + } + elm_object_content_set(popup, ad->popup_vol_ly); + __vcui_view_popup_vol_update_icon(vol_level); + + slider = elm_slider_add(popup); + elm_slider_horizontal_set(slider, EINA_TRUE); + elm_slider_indicator_show_set(slider, EINA_TRUE); + elm_slider_indicator_format_set(slider, "%.0f"); + elm_object_part_content_set(ad->popup_vol_ly, "volume_slider", slider); + elm_slider_min_max_set(slider, 0, 15); + elm_slider_value_set(slider, vol_level); + evas_object_smart_callback_add(slider, "changed", __vcui_view_popup_vol_ringtone_changed_cb, ad); + ad->vol_ringtone_popup_del_timer = ecore_timer_add(POPUP_TIMEOUT_SHORT, __vcui_view_popup_timer_cb_vol_ringtone, ad); + evas_object_smart_callback_add(popup, "timeout", __vcui_view_popup_response_cb_vol_ringtone, ad); + + ad->vol_ringtone_slider_eo = slider; + evas_object_show(popup); + } + +} + +static Eina_Bool __vcui_view_popup_timer_cb_vol_voice(void *data) +{ + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + __vcui_view_popup_response_cb_vol_voice(ad, ad->vol_voice_popup_eo, NULL); + ad->vol_voice_popup_del_timer = NULL; + return ECORE_CALLBACK_CANCEL; +} + +static void __vcui_view_popup_vol_voice_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + double value; + + value = elm_slider_value_get(obj); + if (value > VOICE_VOL_MAX) + value = VOICE_VOL_MAX; + else if (value < VOICE_VOL_MIN) + value = VOICE_VOL_MIN; + ad->voice_vol_val = (int)value; + + _vcui_engine_set_volume_level(VCUI_VOL_VOICE, ad->voice_vol_val); + + elm_slider_value_set(obj, ad->voice_vol_val); + if (ad->vol_voice_popup_del_timer) { + ecore_timer_del(ad->vol_voice_popup_del_timer); + ad->vol_voice_popup_del_timer = NULL; + } + ad->vol_voice_popup_del_timer = ecore_timer_add(POPUP_TIMEOUT_SHORT, __vcui_view_popup_timer_cb_vol_voice, ad); +} + +static void __vcui_view_popup_response_cb_vol_voice(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + if (ad->vol_voice_popup_eo) { + CALL_UI_DEBUG("vol_voice_popup_eo delete."); + evas_object_del(ad->vol_voice_popup_eo); + ad->vol_voice_popup_eo = NULL; + } + + ad->vol_longpress_cnt = 0; + + if (ad->volup_key_longpress_timer) { + ecore_timer_del(ad->volup_key_longpress_timer); + ad->volup_key_longpress_timer = NULL; + } + + if (ad->voldown_key_longpress_timer) { + ecore_timer_del(ad->voldown_key_longpress_timer); + ad->voldown_key_longpress_timer = NULL; + } + + _vcui_cache_flush(); + __vcui_view_popup_win_del(ad); + return; +} + +void _vcui_view_popup_vol_voice(int vol_level) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + Evas_Object *popup = NULL; + Evas_Object *slider = NULL; + Evas_Object *icon = NULL; + + if (ad->vol_voice_popup_eo) { + elm_slider_value_set(ad->vol_voice_slider_eo, vol_level); + if (ad->vol_voice_popup_del_timer) { + ecore_timer_del(ad->vol_voice_popup_del_timer); + ad->vol_voice_popup_del_timer = NULL; + } + ad->vol_voice_popup_del_timer = ecore_timer_add(POPUP_TIMEOUT_SHORT, __vcui_view_popup_timer_cb_vol_voice, ad); + } else { +#ifdef CALL_MW + popup = elm_popup_add(ad->win_main); +#else + ad->popup_mw = __vcui_view_popup_create_win(ad, "base"); + popup = elm_popup_add(ad->popup_mw); +#endif + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_text_set(popup, "title,text", _("IDS_CALL_BODY_CALL")); + + ad->popup_vol_ly = _vcui_load_edj(popup, EDJ_NAME, "volume"); + if (ad->popup_vol_ly == NULL) { + if (popup) { + CALL_UI_DEBUG("popup delete."); + evas_object_del(popup); + popup = NULL; + } + __vcui_view_popup_win_del(ad); + return; + } + elm_object_content_set(popup, ad->popup_vol_ly); + __vcui_view_popup_vol_update_icon(vol_level); + + slider = elm_slider_add(ad->popup_vol_ly); + elm_slider_horizontal_set(slider, EINA_TRUE); + elm_slider_indicator_show_set(slider, EINA_TRUE); + elm_slider_indicator_format_set(slider, "%.0f"); + elm_object_part_content_set(ad->popup_vol_ly, "volume_slider", slider); + elm_slider_min_max_set(slider, 0, 7); + elm_slider_value_set(slider, vol_level); + evas_object_smart_callback_add(slider, "changed", __vcui_view_popup_vol_voice_changed_cb, ad); + ad->vol_voice_popup_del_timer = ecore_timer_add(POPUP_TIMEOUT_SHORT, __vcui_view_popup_timer_cb_vol_voice, ad); + evas_object_smart_callback_add(popup, "block,clicked", __vcui_view_popup_response_cb_vol_voice, ad); + + ad->vol_voice_slider_eo = slider; + ad->vol_voice_popup_eo = popup; + evas_object_show(popup); + } +} + +static Eina_Bool __vcui_view_popup_timer_cb_vol_bt(void *data) +{ + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + ad->vol_bt_popup_del_timer = NULL; + return ECORE_CALLBACK_CANCEL; +} + +static void __vcui_view_popup_vol_bt_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + double value; + + value = elm_slider_value_get(obj); + if (value > BT_VOL_MAX) + value = BT_VOL_MAX; + else if (value < BT_VOL_MIN) + value = BT_VOL_MIN; + + ad->bt_vol_val = (int)value; + + _vcui_engine_set_volume_level(VCUI_VOL_HEADSET, ad->bt_vol_val); + + elm_slider_value_set(obj, ad->bt_vol_val); + if (ad->vol_bt_popup_del_timer) { + ecore_timer_del(ad->vol_bt_popup_del_timer); + ad->vol_bt_popup_del_timer = NULL; + } + ad->vol_bt_popup_del_timer = ecore_timer_add(POPUP_TIMEOUT_SHORT, __vcui_view_popup_timer_cb_vol_bt, ad); +} + +static void __vcui_view_popup_response_cb_vol_bt(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + if (ad->vol_bt_popup_eo) { + CALL_UI_DEBUG("vol_bt_popup_eo delete."); + evas_object_del(ad->vol_bt_popup_eo); + ad->vol_bt_popup_eo = NULL; + __vcui_view_popup_win_del(ad); + } + + ad->vol_longpress_cnt = 0; + + if (ad->volup_key_longpress_timer) { + ecore_timer_del(ad->volup_key_longpress_timer); + ad->volup_key_longpress_timer = NULL; + } + + if (ad->voldown_key_longpress_timer) { + ecore_timer_del(ad->voldown_key_longpress_timer); + ad->voldown_key_longpress_timer = NULL; + } + + _vcui_cache_flush(); + return; +} + +void _vcui_view_popup_vol_bt(int vol_level) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + Evas_Object *popup = NULL; + Evas_Object *slider = NULL; + Evas_Object *icon = NULL; + + if (ad->vol_bt_popup_eo) { + elm_slider_value_set(ad->vol_bt_slider_eo, vol_level); + if (ad->vol_bt_popup_del_timer) { + ecore_timer_del(ad->vol_bt_popup_del_timer); + ad->vol_bt_popup_del_timer = NULL; + } + ad->vol_bt_popup_del_timer = ecore_timer_add(POPUP_TIMEOUT_SHORT, __vcui_view_popup_timer_cb_vol_bt, ad); + } else { +#ifdef CALL_MW + popup = elm_popup_add(ad->win_main); +#else + ad->popup_mw = __vcui_view_popup_create_win(ad, "base"); + popup = elm_popup_add(ad->popup_mw); +#endif + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_text_set(popup, "title,text", _("IDS_CALL_BUTTON_HEADSET")); + + ad->popup_vol_ly = _vcui_load_edj(popup, EDJ_NAME, "volume"); + if (ad->popup_vol_ly == NULL) { + if (popup) { + CALL_UI_DEBUG("popup delete."); + evas_object_del(popup); + popup = NULL; + } + __vcui_view_popup_win_del(ad); + return; + } + elm_object_content_set(popup, ad->popup_vol_ly); + __vcui_view_popup_vol_update_icon(vol_level); + + slider = elm_slider_add(popup); + elm_slider_horizontal_set(slider, EINA_TRUE); + elm_slider_indicator_show_set(slider, EINA_TRUE); + elm_slider_indicator_format_set(slider, "%.0f"); + elm_object_part_content_set(ad->popup_vol_ly, "volume_slider", slider); + elm_slider_min_max_set(slider, 0, 15); + elm_slider_value_set(slider, vol_level); + evas_object_smart_callback_add(slider, "changed", __vcui_view_popup_vol_bt_changed_cb, ad); + ad->vol_bt_popup_del_timer = ecore_timer_add(POPUP_TIMEOUT_SHORT, __vcui_view_popup_timer_cb_vol_bt, ad); + evas_object_smart_callback_add(popup, "timeout", __vcui_view_popup_response_cb_vol_bt, ad); + + ad->vol_bt_slider_eo = slider; + ad->vol_bt_popup_eo = popup; + evas_object_show(popup); + } + +} + +static Eina_Bool __vcui_view_popup_response_cb_delay(void *data) +{ + CALL_UI_DEBUG(".."); + + _vcui_view_popup_load((char *)data, POPUP_TIMEOUT_SHORT, EINA_FALSE); + + vcui_app_call_data_t *ad = _vcui_get_app_data(); + ecore_timer_del(ad->popup_delay); + ad->popup_delay = NULL; + + CALL_UI_DEBUG("delay popup work"); + return EINA_FALSE; +} + +void _vcui_view_popup_load_with_delay(char *popup_msg, double delay_time) +{ + CALL_UI_DEBUG(".."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + ad->popup_delay = ecore_timer_add(delay_time, __vcui_view_popup_response_cb_delay, popup_msg); + CALL_UI_DEBUG("delay popup"); +} + +void _vcui_view_popup_unload_progress(vcui_app_call_data_t *ad) +{ + CALL_UI_DEBUG(".."); + + if (ad->popup_progress_eo) { + evas_object_hide(ad->popup_progress_eo); + evas_object_del(ad->popup_progress_eo); + ad->popup_progress_eo = NULL; + } + __vcui_view_popup_win_del(ad); + + _vcui_cache_flush(); + + return; +} + +static void __vcui_view_popup_progressbar_set_label(char *status_string) +{ + CALL_UI_DEBUG(".."); + Evas_Object *label; + vcui_app_call_data_t *ad = _vcui_get_app_data(); + CALL_UI_DEBUG("popup_progress_set_label ...\n"); + + label = (Evas_Object *)evas_object_data_get(ad->popup_progress_eo, "progress_label"); + elm_object_text_set(label, status_string); +} + +static void __vcui_view_popup_progressbar_response_cb(void *data, Evas_Object *obj, void *event_info) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + CALL_UI_DEBUG("__vcui_view_popup_progressbar_response_cb callback=%d\n", (int)event_info); + + if (ad->popup_progress_eo) { + evas_object_del(ad->popup_progress_eo); + ad->popup_progress_eo = NULL; + } + + evas_object_del(obj); + __vcui_view_popup_win_del(ad); +} + +void _vcui_view_popup_load_progress(char *display_string) +{ + CALL_UI_DEBUG(".."); + Evas_Object *progressbar_eo; + Evas_Object *box, *label; + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + if (NULL != ad->popup_progress_eo) { + __vcui_view_popup_progressbar_set_label(display_string); + return; + } +#ifdef CALL_MW + ad->popup_progress_eo = elm_popup_add(ad->win_main); +#else + ad->popup_mw = __vcui_view_popup_create_win(ad, "base"); + ad->popup_progress_eo = elm_popup_add(ad->popup_mw); +#endif + + label = elm_label_add(ad->popup_progress_eo); + elm_object_text_set(label, display_string); + evas_object_show(label); + box = elm_box_add(ad->popup_progress_eo); + progressbar_eo = elm_progressbar_add(ad->popup_progress_eo); + elm_object_style_set(progressbar_eo, "list_progress"); + elm_progressbar_pulse(progressbar_eo, EINA_TRUE); + evas_object_size_hint_align_set(progressbar_eo, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(progressbar_eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_progressbar_pulse(progressbar_eo, EINA_TRUE); + evas_object_show(progressbar_eo); + elm_box_pack_end(box, label); + elm_box_pack_end(box, progressbar_eo); + evas_object_show(box); + elm_object_content_set(ad->popup_progress_eo, box); + evas_object_smart_callback_add(ad->popup_progress_eo, "timeout", __vcui_view_popup_progressbar_response_cb, NULL); + evas_object_show(ad->popup_progress_eo); + + evas_object_data_set(ad->popup_progress_eo, "progress_label", (void *)label); +} + +void _vcui_view_popup_load_sending_dtmf(char *status_string, char *dtmf_num) +{ + CALL_UI_DEBUG(".."); + char msg[DEF_BUF_LEN_LONG] = { 0, }; + + snprintf(msg, DEF_BUF_LEN_LONG, "%s
%s", status_string, dtmf_num); + + _vcui_view_popup_load_progress(msg); +} + +static void __vcui_view_popup_snd_path_bt_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + elm_radio_value_set(ad->ctxpopup_radio_group_eo, VCUI_SND_PATH_HEADSET); + + _vcui_engine_change_sound_path(VCUI_AUDIO_HEADSET); + + ad->speaker_status = EINA_FALSE; + ad->headset_status = EINA_TRUE; +} + +static void __vcui_view_popup_snd_path_earjack_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + elm_radio_value_set(ad->ctxpopup_radio_group_eo, VCUI_SND_PATH_EARJACK); + + _vcui_engine_change_sound_path(VCUI_AUDIO_EARJACK); + + ad->speaker_status = EINA_FALSE; + ad->headset_status = EINA_FALSE; +} + +static void __vcui_view_popup_snd_path_speaker_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + elm_radio_value_set(ad->ctxpopup_radio_group_eo, VCUI_SND_PATH_SPEAKER); + + _vcui_engine_change_sound_path(VCUI_AUDIO_SPEAKER); + + ad->speaker_status = EINA_TRUE; + ad->headset_status = EINA_FALSE; +} + +static void __vcui_view_popup_hide_snd_path_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + if (ad->ctxpopup_eo) { + evas_object_del(ad->ctxpopup_eo); + ad->ctxpopup_eo = NULL; + } +} + +static void __vcui_view_popup_move_snd_path(Evas_Object *ctxpopup, Evas_Object *win, Evas_Coord touch_x, Evas_Coord touch_y) +{ + evas_object_move(ctxpopup, touch_x, touch_y); +} + +void _vcui_view_popup_load_snd_path() +{ + CALL_UI_DEBUG(".."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + int bearjack_status = EINA_FALSE; + + Evas_Object *ctxpopup = NULL; + Evas_Object *radio = NULL; + Evas_Object *group = NULL; + + int status = -1; + char *bt_name = NULL; + int snd_path; + + /* get bt name */ + bt_name = vconf_get_str(VCONFKEY_BT_HEADSET_NAME); + if (!bt_name) { + bt_name = _("IDS_CALL_BUTTON_HEADSET"); + } + + /* check earjack status */ + if (!vconf_get_int(VCONFKEY_SYSMAN_EARJACK, &status)) { + if (status != VCONFKEY_SYSMAN_EARJACK_REMOVED) { + bearjack_status = EINA_TRUE; + } + } + + if (ad->ctxpopup_eo) { + evas_object_del(ad->ctxpopup_eo); + ad->ctxpopup_eo = NULL; + } + + ctxpopup = elm_ctxpopup_add(ad->win_main); + + evas_object_smart_callback_add(ctxpopup, "dismissed", __vcui_view_popup_hide_snd_path_cb, ad); + + __vcui_view_popup_move_snd_path(ctxpopup, ad->win_main, ad->touch_x, ad->touch_y); + + /* bt headset */ + group = radio = elm_radio_add(ctxpopup); + elm_radio_state_value_set(radio, VCUI_SND_PATH_HEADSET); + evas_object_data_set(radio, "idx", (void *)(VCUI_SND_PATH_HEADSET)); + evas_object_show(radio); + elm_ctxpopup_item_append(ctxpopup, bt_name, radio, __vcui_view_popup_snd_path_bt_cb, ad); + + /* earjack or receiver */ + radio = elm_radio_add(ctxpopup); + elm_radio_state_value_set(radio, VCUI_SND_PATH_EARJACK); + elm_radio_group_add(radio, group); + evas_object_data_set(radio, "idx", (void *)(VCUI_SND_PATH_EARJACK)); + evas_object_show(radio); + if (bearjack_status) { + elm_ctxpopup_item_append(ctxpopup, _("IDS_CALL_BUTTON_HEADPHONES"), radio, __vcui_view_popup_snd_path_earjack_cb, ad); + } else { + elm_ctxpopup_item_append(ctxpopup, _("IDS_CALL_BUTTON_RECEIVER"), radio, __vcui_view_popup_snd_path_earjack_cb, ad); + } + + /* speaker */ + radio = elm_radio_add(ctxpopup); + elm_radio_state_value_set(radio, VCUI_SND_PATH_SPEAKER); + elm_radio_group_add(radio, group); + evas_object_data_set(radio, "idx", (void *)(VCUI_SND_PATH_SPEAKER)); + evas_object_show(radio); + elm_ctxpopup_item_append(ctxpopup, _("IDS_CALL_BUTTON_SPEAKER"), radio, __vcui_view_popup_snd_path_speaker_cb, ad); + /* current sound path set */ + snd_path = _vcui_engine_get_sound_path(); + switch (snd_path) { + case VCUI_AUDIO_SPEAKER: + { + elm_radio_value_set(group, VCUI_SND_PATH_SPEAKER); + } + break; + case VCUI_AUDIO_HEADSET: + { + elm_radio_value_set(group, VCUI_SND_PATH_HEADSET); + } + break; + case VCUI_AUDIO_EARJACK: + case VCUI_AUDIO_RECEIVER: + { + elm_radio_value_set(group, VCUI_SND_PATH_EARJACK); + } + break; + default: + CALL_UI_DEBUG("ERROR - wrong type:[%d]", snd_path); + return; + break; + } + + evas_object_show(ctxpopup); + + ad->ctxpopup_eo = ctxpopup; + ad->ctxpopup_radio_group_eo = group; +} + +#if 0 +static Eina_Bool __vcui_view_ticker_response_cb(void *data) +{ + vcui_app_call_data_t *ad = (vcui_app_call_data_t *) data; + CALL_UI_DEBUG(".."); + + if (ad->ticker_tm) { + ecore_timer_del(ad->ticker_tm); + ad->ticker_tm = NULL; + } + + /* to be implemented */ + + return ECORE_CALLBACK_CANCEL; +} + +void _vcui_view_create_ticker_noti(char *ticker_msg) +{ + Evas_Object *ticker_noti = NULL; + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + CALL_UI_DEBUG("load_ticker_noti_at_bottom enter \n"); + + ticker_noti = elm_tickernoti_add (NULL); + elm_object_style_set(ticker_noti, "info"); + elm_object_text_set(ticker_noti, ticker_msg); + elm_tickernoti_orient_set(ticker_noti, ELM_TICKERNOTI_ORIENT_BOTTOM); + if (ad->ticker_tm) { + ecore_timer_del(ad->ticker_tm); + ad->ticker_tm = NULL; + } + ad->ticker_tm = ecore_timer_add(TICKER_TIMEOUT, __vcui_view_ticker_response_cb, ad); + evas_object_show(ticker_noti); + + CALL_UI_DEBUG("load_ticker_noti_at_bottom over \n"); +} +#endif diff --git a/ui/vcui-view-popup.h b/ui/vcui-view-popup.h new file mode 100755 index 0000000..a912006 --- /dev/null +++ b/ui/vcui-view-popup.h @@ -0,0 +1,43 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VOICE_CALL_UI_POPUP_VIEW_ +#define _VOICE_CALL_UI_POPUP_VIEW_ + +void _vcui_view_popup_unload(Evas_Object *popup_eo); +void _vcui_view_popup_load(char *popup_msg, double time_out, int bterminate); +void _vcui_view_popup_replace(char *popup_msg, double time_out, int bterminate); + +void _vcui_view_popup_vol_ringtone(int vol_level); +void _vcui_view_popup_vol_voice(int vol_level); +void _vcui_view_popup_vol_bt(int vol_level); + +void _vcui_view_popup_load_reject_call(char *name, char *number, int end_app); +void _vcui_view_popup_load_endcall_time(call_data_t *cd); +void _vcui_view_popup_load_redial(void); + +void _vcui_view_popup_load_with_delay(char *popup_msg, double delay_time); + +void _vcui_view_popup_load_sending_dtmf(char *status_string, char *dtmf_num); +void _vcui_view_popup_unload_progress(vcui_app_call_data_t *ad); +void _vcui_view_popup_load_progress(char *display_string); + +void _vcui_view_popup_load_snd_path(void); + +void _vcui_view_create_ticker_noti(char *ticker_msg); + +#endif diff --git a/ui/vcui-view-single-call.c b/ui/vcui-view-single-call.c new file mode 100755 index 0000000..f9c7e23 --- /dev/null +++ b/ui/vcui-view-single-call.c @@ -0,0 +1,316 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-view-common.h" +#include "vcui-view-single-call.h" +#include "vcui-view-elements.h" + +static int __vc_ui_view_single_call_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3); +static int __vc_ui_view_single_call_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2); +static int __vc_ui_view_single_call_onhide(voice_call_view_data_t *view_data); +static int __vc_ui_view_single_call_onshow(voice_call_view_data_t *view_data); +static int __vc_ui_view_single_call_ondestroy(voice_call_view_data_t *view_data); + +static voice_call_view_data_t s_view = { + .type = VIEW_INCALL_ONECALL_VIEW, + .app_data = NULL, + .layout = NULL, + .onCreate = __vc_ui_view_single_call_oncreate, + .onUpdate = __vc_ui_view_single_call_onupdate, + .onHide = __vc_ui_view_single_call_onhide, + .onShow = __vc_ui_view_single_call_onshow, + .onDestroy = __vc_ui_view_single_call_ondestroy, + .priv = NULL, +}; + +voice_call_view_data_t *_vc_ui_view_single_call_new(vcui_app_call_data_t *ad) +{ + s_view.app_data = ad; + s_view.priv = calloc(1, sizeof(incall_one_view_priv_t)); + + if (!s_view.priv) { + CALL_UI_DEBUG("ERROR!!!!!!!!!!!"); + } + + return &s_view; +} + +static void __vc_ui_view_single_call_draw_screen(Evas_Object *eo, void *data) +{ + CALL_UI_DEBUG(".."); + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incall_one_view_priv_t *priv = (incall_one_view_priv_t *)vd->priv; + vcui_app_call_data_t *ad = vd->app_data; + + if (priv->now_data == NULL) { + CALL_UI_DEBUG("Now Data is NULL"); + return; + } + + /* ============ Check valid Evas Object ============= */ + int valid = 0; + CALL_UI_KPI("_vcui_check_valid_eo ONEVIEW start"); + valid = _vcui_check_valid_eo(priv->contents, "ONEVIEW"); + CALL_UI_KPI("_vcui_check_valid_eo ONEVIEW done"); + if (valid == -1) { + CALL_UI_DEBUG("[========== ONEVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + return; + } + /* ============ Check valid Evas Object ============= */ + + /* call image */ + if (strcmp((char *)priv->now_data->call_file_path, NOIMG_ICON) == 0) { + _vcui_show_wallpaper_image(priv->contents); + } else { + CALL_UI_DEBUG("some image case!!"); + _vcui_show_wallpaper_image(priv->contents); + priv->ic = _vcui_show_contact_image(priv->contents, vd->app_data->win_main, priv->now_data->call_file_path); + if (priv->now_data->caller_status == CALL_HOLD) { + double scale_factor = 0.0; + scale_factor = elm_config_scale_get(); + CALL_UI_DEBUG("scale_factor %f", scale_factor); + + if (scale_factor == 1.0) { + edje_object_signal_emit(_EDJ(priv->contents), "SHOW_DIM_HD", "CID_HD"); + } else { + edje_object_signal_emit(_EDJ(priv->contents), "SHOW_DIM_WVGA", "CID_WVGA"); + } + } else { + edje_object_signal_emit(_EDJ(priv->contents), "HIDE_DIM", "CID"); + } + } + + /* call name (if nothing, call number) */ + CALL_UI_KPI("edje_object_part_text_set start"); + if (strlen((char *)priv->now_data->call_display) == 0) { + edje_object_part_text_set(_EDJ(eo), "txt_call_name", (char *)priv->now_data->call_num); + } else { + edje_object_part_text_set(_EDJ(eo), "txt_call_name", (char *)priv->now_data->call_display); + edje_object_part_text_set(_EDJ(eo), "txt_contact_phone_type", (char *)priv->now_data->call_num); + } + CALL_UI_KPI("edje_object_part_text_set done"); + + CALL_UI_KPI("_vcui_view_common_set_each_time start"); + _vcui_view_common_set_each_time(priv->now_data->start_time); + CALL_UI_KPI("_vcui_view_common_set_each_time done"); + + CALL_UI_KPI("_vcui_create_top_left_button start"); + _vcui_create_top_left_button(vd); + CALL_UI_KPI("_vcui_create_top_left_button done"); + + CALL_UI_KPI("_vcui_create_top_right_button start"); + _vcui_create_top_right_button(vd); + CALL_UI_KPI("_vcui_create_top_right_button done"); + + CALL_UI_KPI("_vcui_create_bottom_left_button start"); + _vcui_create_bottom_left_button(vd); + CALL_UI_KPI("_vcui_create_bottom_left_button done"); + + CALL_UI_KPI("_vcui_create_bottom_middle_button start"); + _vcui_create_bottom_middle_button(vd); + CALL_UI_KPI("_vcui_create_bottom_middle_button done"); + + if ((_vcui_is_phonelock_status() == EINA_TRUE)&&(_vcui_is_idle_lock() == EINA_TRUE)) { + CALL_UI_KPI("_vcui_create_top_middle_button start"); + _vcui_create_top_middle_button_disabled(vd); + CALL_UI_KPI("_vcui_create_top_middle_button done"); + + CALL_UI_KPI("_vcui_create_bottom_right_button start"); + _vcui_create_bottom_right_button_disabled(vd); + CALL_UI_KPI("_vcui_create_bottom_right_button done"); + } else { + CALL_UI_KPI("_vcui_create_top_middle_button start"); + _vcui_create_top_middle_button(vd); + CALL_UI_KPI("_vcui_create_top_middle_button done"); + + _vcui_create_bottom_right_button(vd); + } + + CALL_UI_KPI("_vcui_create_button_bigend start"); + _vcui_create_button_bigend(vd); + CALL_UI_KPI("_vcui_create_button_bigend done"); + + CALL_UI_KPI("edje_object_signal_emit effect start"); + if (ad->beffect_needed == EINA_TRUE) { + edje_object_signal_emit(_EDJ(priv->contents), "SHOW_EFFECT", "ALLBTN"); + ad->beffect_needed = EINA_FALSE; + } else { + edje_object_signal_emit(_EDJ(priv->contents), "SHOW_NO_EFFECT", "ALLBTN"); + } + CALL_UI_KPI("edje_object_signal_emit effect done"); + + CALL_UI_KPI("evas_object_show start"); + evas_object_show(eo); + CALL_UI_KPI("evas_object_show done"); +} + +static Evas_Object *__vc_ui_view_single_call_create_contents(void *data) +{ + if (data == NULL) { + CALL_UI_DEBUG("ERROR"); + return NULL; + } + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + Evas_Object *eo = NULL; + + /* load edje */ + eo = _vcui_load_edj(vd->app_data->win_main, EDJ_NAME, GRP_INCALL); + if (eo == NULL) + return NULL; + + return eo; +} + +static Evas_Object *__vc_ui_view_single_call_create_layout_main(Evas_Object *parent) +{ + if (parent == NULL) { + CALL_UI_DEBUG("ERROR"); + return NULL; + } + + Evas_Object *ly; + ly = elm_layout_add(parent); + retvm_if(ly == NULL, NULL, "Failed elm_layout_add."); + + elm_layout_theme_set(ly, "standard", "window", "integration"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(parent, ly); + + edje_object_signal_emit(_EDJ(ly), "elm,state,show,indicator", "elm"); + edje_object_signal_emit(_EDJ(ly), "elm,state,show,content", "elm"); + evas_object_show(ly); + + return ly; +} + +static int __vc_ui_view_single_call_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3) +{ + CALL_UI_DEBUG("incall view create"); + voice_call_view_data_t *vd = view_data; + incall_one_view_priv_t *priv = (incall_one_view_priv_t *)vd->priv; + + priv->now_data = _vcui_doc_get_first(); + if (priv->now_data == NULL) { + CALL_UI_DEBUG("call data is null"); + return VC_ERROR; + } + + if (!vd->layout) { + + CALL_UI_KPI("__vc_ui_view_single_call_create_layout_main start"); + vd->layout = __vc_ui_view_single_call_create_layout_main(vd->app_data->win_main); + CALL_UI_KPI("__vc_ui_view_single_call_create_layout_main done"); + if (vd->layout == NULL) { + CALL_UI_DEBUG("ERROR"); + return VC_ERROR; + } + + CALL_UI_KPI("__vc_ui_view_single_call_create_contents start"); + priv->contents = __vc_ui_view_single_call_create_contents(vd); + elm_object_part_content_set(vd->layout, "elm.swallow.content", priv->contents); + CALL_UI_KPI("__vc_ui_view_single_call_create_contents done"); + + CALL_UI_KPI("evas_object_name_set start"); + evas_object_name_set(priv->contents, "ONEVIEW"); + CALL_UI_KPI("evas_object_name_set done"); + CALL_UI_DEBUG("[========== ONEVIEW: priv->contents Addr : [%p] ==========]", priv->contents); + + } else { + CALL_UI_DEBUG("[UI]ad->layout_incall==NULL case "); + evas_object_show(vd->layout); + } + + __vc_ui_view_single_call_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vc_ui_view_single_call_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2) +{ + CALL_UI_DEBUG("incall view update"); + + __vc_ui_view_single_call_onshow(view_data); + + return VC_NO_ERROR; +} + +static int __vc_ui_view_single_call_onhide(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("incall view hide"); + + evas_object_hide(view_data->layout); + return VC_NO_ERROR; +} + +static int __vc_ui_view_single_call_onshow(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("incall view show"); + CALL_UI_KPI("__vc_ui_view_single_call_onshow start"); + incall_one_view_priv_t *priv = (incall_one_view_priv_t *)view_data->priv; + + priv->now_data = _vcui_doc_get_first(); + if (priv->now_data == NULL) { + CALL_UI_DEBUG("call data is null"); + return VC_ERROR; + } + CALL_UI_KPI("__vc_ui_view_single_call_draw_screen start"); + __vc_ui_view_single_call_draw_screen(priv->contents, view_data); + CALL_UI_KPI("__vc_ui_view_single_call_draw_screen done"); + + + CALL_UI_KPI("incall-one-view hide start"); + evas_object_hide(view_data->layout); + CALL_UI_KPI("incall-one-view hide done"); + CALL_UI_KPI("incall-one-view show start"); + evas_object_show(view_data->layout); + CALL_UI_KPI("incall-one-view show done"); + CALL_UI_KPI("__vc_ui_view_single_call_onshow done"); + return VC_NO_ERROR; +} + +static int __vc_ui_view_single_call_ondestroy(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG("incall view destroy"); + + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + voice_call_view_data_t *vd = ad->view_st[VIEW_INCALL_ONECALL_VIEW]; + incall_one_view_priv_t *priv = (incall_one_view_priv_t *)vd->priv; + + if (priv != NULL) { + if (priv->contents) { + evas_object_del(priv->contents); + priv->contents = NULL; + } + + free(priv); + priv = NULL; + } + + if (vd->layout != NULL) { + evas_object_hide(vd->layout); + evas_object_del(vd->layout); + vd->layout = NULL; + } + + ad->view_st[VIEW_INCALL_ONECALL_VIEW] = NULL; + + _vcui_cache_flush(); + CALL_UI_DEBUG("complete destroy one view"); + return VC_NO_ERROR; +} diff --git a/ui/vcui-view-single-call.h b/ui/vcui-view-single-call.h new file mode 100755 index 0000000..e5aced4 --- /dev/null +++ b/ui/vcui-view-single-call.h @@ -0,0 +1,29 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_VIEW_SINGLE_CALL_ +#define _VCUI_VIEW_SINGLE_CALL_ + +typedef struct { + Evas_Object *contents; + Evas_Object *ic; + Evas_Object *record_btn; + call_data_t *now_data; +} incall_one_view_priv_t; + +voice_call_view_data_t *_vc_ui_view_single_call_new(vcui_app_call_data_t *ad); +#endif -- 2.7.4