gengxin
authorCCC <2393524978@qq.com>
Wed, 12 Jul 2023 02:33:00 +0000 (10:33 +0800)
committerCCC <2393524978@qq.com>
Wed, 12 Jul 2023 02:33:00 +0000 (10:33 +0800)
15 files changed:
2.sdk/new_clean.sh
2.sdk/project/Z5_K6/make_option.mk
2.sdk/sdk/gui/lv_watch/app_adaptor/app_adaptor.c
2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_jrtc_client.c
2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call.c
2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call.h
2.sdk/sdk/gui/lv_watch/lv_apps/phone/phone.c
2.sdk/sdk/gui/lv_watch/lv_apps/setting/setting_about.c
2.sdk/sdk/gui/lv_watch/mmi_protocol/mmi_protocol_api.c
2.sdk/sdk/gui/lv_watch/mmi_protocol/mmi_protocol_api.h
2.sdk/sdk/gui/lv_watch/mmi_protocol/mmi_protocol_fzd.c
2.sdk/sdk/gui/lv_watch/mmi_protocol/mmi_protocol_fzd.h
2.sdk/sdk/gui/lv_watch/mmi_sundry/mmi_sundry.c
2.sdk/sdk/gui/lv_watch/modem/mmi_modem_tcp/mmi_modem_tcp_msg_handler_impl.c
2.sdk/sdk/gui/lvgl/src/lv_core/lv_indev.c

index 843e26d..a86267c 100644 (file)
@@ -7,6 +7,15 @@ elif [ ! -e "project/$1" ] ; then
 else
     echo $1
     
+    build_time=$(date "+%Y%m%d_%H%M%S")
+    echo $build_time
+
+    typeset -u t_str
+    t_str=$1
+    echo "#define MMI_BUILD_PROJECT \"$t_str\"" > sdk/build_info.h
+    echo >> sdk/build_info.h
+    echo "#define MMI_BUILD_TIME \"$build_time\"" >> sdk/build_info.h
+
     cp project/$1/make_option.mk sdk/
 
     cd sdk
index b3bd810..0995065 100644 (file)
@@ -1,7 +1,7 @@
 #
 # PS_MODE = { LTEONLY, LTEGSM, LWG } # c use LTEGSM; s use LWG
 #
-PS_MODE := LWG
+PS_MODE := LTEGSM
 
 
 #
index c03b5bd..3614fab 100644 (file)
@@ -121,18 +121,41 @@ void app_adaptor_get_weather_req(app_adaptor_weather_t * weather)
 #endif
 }
 
+
+#ifdef __MMI_ZHSX_SUPPORT__
+#include "../../../build_info.h"
+#endif
+
 char * app_adaptor_get_model_id(void)
 {
+#ifdef __MMI_ZHSX_SUPPORT__
+       static char s_project[32] = {0};
+
+       snprintf(s_project, 31, "%s", MMI_BUILD_PROJECT);
+
+       return s_project;
+
+#else
     static char model[] = "ASR01";
     return model;
+#endif
 }
 
 char * app_adaptor_get_version(void)
 {
+#ifdef __MMI_ZHSX_SUPPORT__
+       static char s_version[32] = {0};
+
+       snprintf(s_version, 31, "%s", MMI_BUILD_TIME);
+
+       return s_version;
+       
+#else
     static char version[40] = {};
 
     snprintf(version, 40, "%s\n%s", __DATE__, __TIME__);
     return version;
+#endif
 }
 
 char* test_get_version(void) {
index 869091a..aeecf8e 100644 (file)
@@ -124,9 +124,9 @@ static void mmi_video_call_jrtc_on_state(lv_task_t * task)
                    s_video_call_jrtc.closed_timer_id = Hal_Timer_Start(100, mmi_video_call_jrtc_timeout_cb, NULL, 0);
                }
 
-               if(MMI_VOIP_CALL_STATE_NULL != mmi_video_call_params_state_get()) 
+               if(MMI_VIDEO_CALL_STATE_NONE != mmi_video_call_params_state_get()) 
                        {
-                   watch_voip_call_response_no_carrier(0, 1);
+                   mmi_vc_ring_off_no_carrier(1);
                }
                break;
 
@@ -143,9 +143,9 @@ static void mmi_video_call_jrtc_on_state(lv_task_t * task)
                break;
 
            case JRTC_TALKING:
-               if(MMI_VOIP_CALL_STATE_ACTIVE != mmi_video_call_params_state_get()) 
+               if(MMI_VIDEO_CALL_STATE_CALLING != mmi_video_call_params_state_get()) 
                        {
-                   watch_voip_call_response_connect(0);
+                   mmi_vc_call_action_connect();
                }
 
                /* Get image */
@@ -206,6 +206,9 @@ int8_t mmi_video_call_dial_req(MODEM_VIDEO_CALL_TYPE calltype, char * pContactUr
     int8_t ret = -1;
 
        VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__, pContactUri, calltype);
+
+       mmi_vc_call_operate_send_to_server(2);
+       
     if (NULL == s_video_call_jrtc.jrtc_ptr)
         ret = mmi_video_call_jrtc_open(pContactUri, calltype);
 
@@ -216,6 +219,8 @@ void mmi_video_call_hangup_req(BOOL bye)
 {
        VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: %p,%d\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr, bye);
 
+       mmi_vc_call_operate_send_to_server(0);
+       
     if (NULL != s_video_call_jrtc.jrtc_ptr) 
        {
         video_call_jrtc_error_e err = (TRUE == bye) ? JRTC_EBYE : JRTC_EAUDIOCALL;
@@ -225,7 +230,7 @@ void mmi_video_call_hangup_req(BOOL bye)
     } 
        else
        {
-        watch_voip_call_response_no_carrier(0, 0);
+        mmi_vc_ring_off_no_carrier(0);
     }
 }
 
@@ -234,6 +239,9 @@ int8_t mmi_video_call_answer_req(void)
     int8_t ret = -1;
 
        VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: %p\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr);
+
+       mmi_vc_call_operate_send_to_server(1);
+       
     if (NULL == s_video_call_jrtc.jrtc_ptr)
         ret = mmi_video_call_jrtc_open(mmi_video_call_params_number_get(), mmi_video_call_params_type_get());
 
@@ -244,6 +252,8 @@ void mmi_video_call_reject_req(BOOL bye)
 {
        VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: %p,%d\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr, bye);
 
+       mmi_vc_call_operate_send_to_server(0);
+
     if (NULL != s_video_call_jrtc.jrtc_ptr) 
        {
         video_call_jrtc_error_e err = (TRUE == bye) ? JRTC_EBYE : JRTC_EAUDIOCALL;
@@ -253,7 +263,7 @@ void mmi_video_call_reject_req(BOOL bye)
     } 
        else 
        {
-        watch_voip_call_response_no_carrier(0, 0);
+        mmi_vc_ring_off_no_carrier(0);
     }
 }
 
index 9ddf737..9b48c69 100644 (file)
@@ -23,11 +23,7 @@ lv_color_t g_cbuf[canvas_width * canvas_heigh + 8]  __attribute__((aligned(8)));
 /**********************
 *  STATIC PROTOTYPES
 **********************/
-static lv_obj_t * voip_phone_cont_create(lv_obj_t * par, lv_align_t cont_layout, lv_style_t * style, lv_coord_t width);
 static lv_obj_t * voip_ring_off_content_create(lv_obj_t * par);
-static void mmi_video_call_phone_dialing(lv_obj_t * content);
-static void mmi_video_call_phone_ring(lv_obj_t * content);
-static void mmi_video_call_phone_connected(lv_obj_t * content);
 static void voip_phone_left_slide_callback(lv_obj_t * obj);
 static void voip_phone_right_slide_callback(lv_obj_t * obj);
 static void voip_phone_down_slide_callback(lv_obj_t * obj);
@@ -36,9 +32,6 @@ static void voip_ring_animation(lv_obj_t * par);
 static void voip_connected_animation(lv_obj_t * obj);
 static void voip_volume_btn_action(lv_obj_t * obj, lv_event_t e);
 static void voip_slider_action(lv_obj_t * slider, lv_event_t e);
-static void voip_ring_hook_action(lv_obj_t * btn, lv_event_t e);
-static void voip_phone_ring_off_timeout_cb(void * para);
-static void voip_phone_callreq_timeout_cb(void * para);
 static void voip_phone_cleanup(void);
 static void voip_phone_obj_hide_anim_end(lv_anim_t * anim);
 static void voip_anim_fp_dialing_ring(lv_obj_t * obj, int32_t x);
@@ -50,18 +43,12 @@ static void voip_get_time_elaps(uint32_t last_time, char * str, int8_t size);
 static void voip_set_volume_when_slider_act(void);
 static void voip_local_remote_switch_action(lv_obj_t * btn, lv_event_t e);
 static void canvas_button_hidden_event_cb(lv_obj_t * obj, lv_event_t e);
-static void video_call_add_element(lv_obj_t * element);
 static void voip_signal_check_start(void * ext);
 static void voip_signal_check_stop(void);
 static bool is_rat_gsm(void);
 static void voip_rat_check_start(void);
 static void voip_rat_check_stop(void);
 
-#if VOIP_PHONE_TEST
-static void voip_phone_connected_cb(void * para);
-static void watch_voip_call_response_originating(int32_t index);
-#endif
-
 
 void voip_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority)
 {
@@ -300,190 +287,6 @@ static lv_obj_t * voip_append_obj(lv_obj_t * page)
     return(voip_append_obj);
 }
 
-static lv_obj_t * mmi_video_call_phone_create(lv_obj_t * activity_obj, voip_phone_ui_e phone_ui_id)
-{
-    printf("%s %d\n", __FUNCTION__, __LINE__);
-
-    if(VOIP_PHONE_UI_CONNECTED == phone_ui_id) {
-        /* set speaker volume to nv when leaving activiry's slider */
-        voip_set_volume_when_slider_act();
-    }
-
-    /* cleanup phone first */
-    voip_phone_cleanup();
-
-    if(activity_obj == NULL) 
-       {
-        lv_watch_activity_ext_t activity_ext = {0};
-
-        activity_ext.actId           = ACT_ID_VOIPPHONE;
-        activity_ext.create          = NULL;
-        activity_ext.prepare_destory = voip_phone_prepare_destory;
-        activity_obj                 = lv_watch_creat_activity_obj(&activity_ext);
-        LV_ASSERT_MEM(activity_obj);
-        if(activity_obj == NULL) {
-            return(NULL);
-        }
-    }
-
-    lv_obj_t * obj = lv_watch_obj_create(activity_obj);
-    LV_ASSERT_MEM(obj);
-    if(obj == NULL) {
-        return(NULL);
-    }
-    lv_watch_obj_set_anim_mode(obj, LV_WATCH_LEFT_OR_RIGHT_SLIDE_CALLBACK);
-    lv_watch_obj_set_left_slide_cb(obj, voip_phone_left_slide_callback);
-    lv_watch_obj_set_right_slide_cb(obj, voip_phone_right_slide_callback);
-
-    lv_voip_phone_obj_ext_t * ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_voip_phone_obj_ext_t));
-    LV_ASSERT_MEM(ext);
-    if(ext == NULL) {
-        return(NULL);
-    }
-
-    ext->phone_status_label       = NULL;
-    ext->phone_animation_obj      = NULL;
-    ext->phone_ui_t               = phone_ui_id;
-    ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_NULL;
-#if ENABLE_VIDEO_SCALE == 0
-    ext->voiph263fmt = VOIP_H263_FMT_QCIF;
-#else
-    ext->voiph263fmt = VOIP_H263_FMT_OTHER;
-#endif
-
-    hal_rtc_t rtc_curr;            // current rtc time
-    Hal_Rtc_Gettime(&rtc_curr);
-    ext->connect_start_time = time_to_seconds(&rtc_curr);
-    ext->connect_time = NULL;
-    ext->ring_value_button = NULL;
-    ext->view_switch_button = NULL;
-    ext->ring_off_button = NULL;
-    ext->canvas_button_hidden_flag = NOT_HIDDEN;
-
-    /* content */
-    lv_obj_t * content = lv_cont_create(obj, NULL);
-    lv_obj_set_size(content, lv_obj_get_width(obj), lv_obj_get_height(obj) - 20);
-    //lv_cont_set_layout(content, LV_LAYOUT_COLUMN_MID);
-    LV_ASSERT_MEM(content);
-    if(content == NULL) {
-        return(NULL);
-    }
-    lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
-    /* must click false */
-    lv_obj_set_click(content, false);
-    lv_obj_align(content, obj, LV_ALIGN_CENTER, 0, 0);
-
-    if(ext->phone_ui_t == VOIP_PHONE_UI_DIALING) {
-        mmi_video_call_phone_dialing(content);
-        voip_dialing_animation(ext->phone_status_label);
-    } else if(ext->phone_ui_t == VOIP_PHONE_UI_INCOMING) {
-        mmi_video_call_phone_ring(content);
-        voip_ring_animation(ext->phone_status_label);
-    } else if(ext->phone_ui_t == PHONE_UI_CONNECTED) {
-        mmi_video_call_phone_connected(content);
-        voip_connected_animation(ext->phone_status_label);
-    }
-
-    return(obj);
-}
-
-lv_res_t mmi_video_call_phone_ring_off_create()
-{
-    printf("%s %d\n", __FUNCTION__, __LINE__);
-
-    lv_voip_phone_obj_ext_t * ext = voip_phone_get_ext();
-    LV_ASSERT_MEM(ext);
-    if(ext == NULL) {
-        return(LV_RES_INV);
-    }
-
-    // stop callreq timer
-    if(NULL != s_video_call_params.callreq_timer_id) {
-        Hal_Timer_Stop(s_video_call_params.callreq_timer_id);
-        s_video_call_params.callreq_timer_id = NULL;
-    }
-
-    if(ext->phone_ui_t == VOIP_PHONE_UI_INCOMING || ext->phone_ui_t == VOIP_PHONE_UI_DIALING) {
-        if(ext->phone_status_label) {
-            lv_label_set_text(ext->phone_status_label, "");
-        }
-
-        voip_ring_off_content_create(voip_phone_get_obj());
-    } else if(ext->phone_ui_t == PHONE_UI_CONNECTED) {
-        voip_ring_off_content_create(voip_phone_get_obj());
-    }
-
-    if(ext->phone_animation_obj) {
-        lv_obj_del(ext->phone_animation_obj);
-        ext->phone_animation_obj = NULL;
-    }
-
-    /* set speaker volume to nv when leaving activiry's slider */
-    voip_set_volume_when_slider_act();
-
-    /* phone cleanup when anim end*/
-    lv_anim_t a;
-    lv_anim_init(&a);
-    lv_anim_set_var(&a, voip_phone_get_obj());
-    lv_anim_set_ready_cb(&a, (lv_anim_ready_cb_t)voip_phone_obj_hide_anim_end);
-    lv_anim_set_time(&a, VOIP_PHONE_RING_OFF_CONTINUE_TIME);
-    lv_anim_start(&a);
-
-    voip_signal_check_stop();
-    voip_rat_check_stop();
-
-    return(LV_RES_OK);
-}
-
-void mmi_video_call_phone_ring_off_action(lv_obj_t * btn, lv_event_t e)
-{
-    if(LV_EVENT_CLICKED != e) {
-        return;
-    }
-
-    printf("%s:  %d, state=%d\n", __FUNCTION__, __LINE__, s_video_call_params.state);
-
-    if(false == s_video_call_params.ring_off) {
-        s_video_call_params.ring_off = true;
-
-        if(NULL == s_video_call_params.ring_off_timer_id) {
-            s_video_call_params.ring_off_timer_id = Hal_Timer_Start(VOIP_RING_OFF_TIMER_LEN, voip_phone_ring_off_timeout_cb, NULL, 0);
-        }
-        // stop callreq timer
-        if(NULL != s_video_call_params.callreq_timer_id) {
-            Hal_Timer_Stop(s_video_call_params.callreq_timer_id);
-            s_video_call_params.callreq_timer_id = NULL;
-        }
-    }
-
-    switch(s_video_call_params.state) {
-        case MMI_VOIP_CALL_STATE_NULL:
-        case MMI_VOIP_CALL_STATE_INVALID:
-            // do noting
-            break;
-
-        case MMI_VOIP_CALL_STATE_ACTIVE:
-            mmi_video_call_hangup_req(TRUE);
-            break;
-
-        case MMI_VOIP_CALL_STATE_INCOMING:
-            Hal_Tone_Play_End();
-            mmi_video_call_reject_req(TRUE);
-            break;
-
-        default:
-            mmi_video_call_hangup_req(TRUE);
-            break;
-    } /* switch */
-
-    voip_signal_check_stop();
-    voip_rat_check_stop();
-
-#if VOIP_PHONE_TEST
-    watch_voip_call_response_no_carrier(s_video_call_params.index, 0);
-#endif
-}
-
 lv_voip_phone_obj_ext_t * voip_phone_get_ext(void)
 {
     lv_voip_phone_obj_ext_t * ext = NULL;
@@ -524,39 +327,11 @@ static lv_obj_t * voip_phone_get_obj(void)
     return(watch_obj);
 }
 
-#if VOIP_PHONE_TEST
-
-static void voip_phone_connected_cb(void * para)
-{
-    printf("%s %d\n", __FUNCTION__, __LINE__);
-    watch_voip_call_response_connect(s_video_call_params.index);
-}
-#endif
-
 static void voip_phone_left_slide_callback(lv_obj_t * obj)
 {
     printf("%s %d\n", __FUNCTION__, __LINE__);
-#if VOIP_PHONE_TEST
-    if((MMI_VOIP_CALL_STATE_INCOMING == s_video_call_params.state)) {   // MT call
-        int32_t index = 1;
-
-        watch_voip_call_response_originating(index);
-        watch_voip_call_response_alerting(index);
-
-        Hal_Timer_Start(60, voip_phone_connected_cb, NULL, 0);
-    }
-
-    else if(MMI_VOIP_CALL_STATE_DIALING == s_video_call_params.state) {    // MO call
-        int32_t index = 1;
-
-        watch_voip_call_response_originating(index);
-        watch_voip_call_response_alerting(index);
-
-        Hal_Timer_Start(60, voip_phone_connected_cb, NULL, 0);
-    } else
-#endif
-        if((MMI_VOIP_CALL_STATE_ACTIVE == s_video_call_params.state)
-                && (MODEM_VIDEO_CALL_TYPE_VIDEO == s_video_call_params.voip_call_type)) {
+        if((MMI_VIDEO_CALL_STATE_CALLING == s_video_call_params.state)
+                && (MODEM_VIDEO_CALL_TYPE_VIDEO == s_video_call_params.call_type)) {
             voip_local_remote_switch_action(NULL, LV_EVENT_CLICKED);
         }
 }
@@ -564,7 +339,7 @@ static void voip_phone_left_slide_callback(lv_obj_t * obj)
 static void voip_phone_right_slide_callback(lv_obj_t * obj)
 {
     printf("%s %d\n", __FUNCTION__, __LINE__);
-    mmi_video_call_phone_ring_off_action(NULL, LV_EVENT_CLICKED);
+    mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);
 }
 
 static void voip_phone_down_slide_callback(lv_obj_t * obj)
@@ -573,24 +348,6 @@ static void voip_phone_down_slide_callback(lv_obj_t * obj)
     voip_volume_btn_action(NULL, LV_EVENT_CLICKED);
 }
 
-static lv_obj_t * voip_phone_cont_create(lv_obj_t * par, lv_align_t cont_layout, lv_style_t * style, lv_coord_t width)
-{
-    printf("%s %d\n", __FUNCTION__, __LINE__);
-
-    lv_obj_t * content = lv_cont_create(par, NULL);
-
-    if(width > 0) {
-        lv_cont_set_fit2(content, LV_FIT_NONE, LV_FIT_TIGHT);
-        lv_obj_set_width(content, width);
-    } else {
-        lv_cont_set_fit2(content, LV_FIT_TIGHT, LV_FIT_TIGHT);
-    }
-    lv_obj_add_style(content, LV_OBJ_PART_MAIN, style);
-    lv_cont_set_layout(content, cont_layout);
-    lv_obj_set_click(content, false);
-    return(content);
-}
-
 static void voip_slider_action(lv_obj_t * slider, lv_event_t e)
 {
     if(e == LV_EVENT_VALUE_CHANGED)
@@ -653,7 +410,7 @@ static lv_obj_t * voip_ring_off_content_create(lv_obj_t * par)
 
     lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_cont_opa1);
     lv_obj_set_size(content, 204, 44);
-    if(ext->phone_ui_t == VOIP_PHONE_UI_INCOMING || ext->phone_ui_t == VOIP_PHONE_UI_DIALING) {
+    if(ext->phone_ui_t == MMI_VC_UI_INCOMING || ext->phone_ui_t == MMI_VC_UI_DIALING) {
         lv_obj_align(content, obj, LV_ALIGN_IN_TOP_MID, 0, 10);
     } else {
         lv_obj_align(content, obj, LV_ALIGN_CENTER, 0, -12);
@@ -682,35 +439,10 @@ static lv_obj_t * voip_ring_off_content_create(lv_obj_t * par)
     lv_obj_set_click(label, false);
 
     return(obj);
-} /* voip_ring_off_content_create */
-
-static void voip_phone_ring_off_timeout_cb(void * para)
-{
-    printf("%s %d\n", __FUNCTION__, __LINE__);
-    s_video_call_params.ring_off_timer_id = NULL;
-    s_video_call_params.ring_off_timeout  = true;
-    watch_voip_call_response_no_carrier(s_video_call_params.index, 0);
 }
 
-static void voip_ring_hook_action(lv_obj_t * btn, lv_event_t e)
-{
-    if(LV_EVENT_CLICKED != e) {
-        return;
-    }
-
-    printf("%s %d\n", __FUNCTION__, __LINE__);
-
-    if(btn) {
-        lv_obj_set_click(btn, false);
-    }
 
-    Hal_Tone_Play_End();
 
-    int8_t ret = mmi_video_call_answer_req();
-    if(ret < 0) {
-        watch_voip_call_response_no_carrier(s_video_call_params.index, 0);
-    }
-}
 
 static void voip_phone_cleanup(void)
 {
@@ -851,364 +583,23 @@ static void voip_anim_fp_connected(lv_anim_t * anim)
     }
 }
 
-static void mmi_video_call_phone_dialing(lv_obj_t * content)
-{
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: \n", __FUNCTION__, __LINE__);
 
-    lv_voip_phone_obj_ext_t * ext = voip_phone_get_ext();
+static void voip_phone_prepare_destory(lv_obj_t * activity_obj)
+{
+    printf("%s %d\n", __FUNCTION__, __LINE__);
 
-    LV_ASSERT_MEM(ext);
-    if(ext == NULL) {
-        return;
-    }
+    lv_watch_png_cache_all_free();
 
-    // label dialing
-    lv_obj_t * label = lv_label_create(content, NULL);
-    lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20);
-    lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
-    lv_label_set_text_id(label, WATCH_TEXT_ID_DAILING);
-    lv_obj_set_click(label, false);
-       lv_obj_align(label, content, LV_ALIGN_IN_TOP_MID, 0, 10);
-    ext->phone_status_label = label;
+    // stop playing tone
+    Hal_Tone_Play_End();
 
-    // img
-    lv_obj_t * img = lv_img_create(content, NULL);
-       lv_img_set_src(img, ICON_VIDEO_CALL_CONTACT_PHOTO);
-       lv_obj_align(img, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
-    lv_obj_set_click(img, false);
+    // ring off
+    mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);
 
-    // name
-    label = lv_label_create(content, NULL);
-    lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
-    lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
-       lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL);
-       lv_obj_set_width(label, lv_obj_get_width(content) - 20);
-    if(strlen(s_video_call_params.name) > 0) 
-       {
-        lv_label_set_text(label, s_video_call_params.name);
-    } 
-       else 
-       {
-        lv_label_set_text(label, s_video_call_params.number);
-    }
-       lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
-    lv_obj_set_click(label, false);
-
-       #if 0
-    // btn volume
-    lv_obj_t * btn;
-    btn = lv_imgbtn_create(cont, NULL);
-    lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_PHONE_RING_VOLUME);
-    lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_PHONE_RING_VOLUME);
-    lv_obj_set_event_cb(btn, voip_volume_btn_action);
-    lv_obj_align(btn, cont, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
-       #endif
-
-    // btn ring off
-    lv_obj_t * btn = lv_imgbtn_create(content, NULL);
-    lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN);
-    lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN);
-    lv_obj_set_event_cb(btn, mmi_video_call_phone_ring_off_action);
-    lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_MID, 0, -30);
-}
-
-static void mmi_video_call_phone_ring(lv_obj_t * content)
-{
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-    lv_voip_phone_obj_ext_t * ext = voip_phone_get_ext();
-
-    LV_ASSERT_MEM(ext);
-    if(ext == NULL) {
-        return;
-    }
-    lv_obj_t * label;
-
-    // label ringing
-    label = lv_label_create(content, NULL);
-    lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20);
-    lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
-    lv_label_set_text_id(label, WATCH_TEXT_ID_RINGING);
-    lv_obj_set_click(label, false);
-    ext->phone_status_label = label;
-
-    // img
-    lv_obj_t * img = lv_img_create(content, NULL);
-       lv_img_set_src(img, ICON_VIDEO_CALL_CONTACT_PHOTO);
-       lv_obj_align(img, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
-    lv_obj_set_click(img, false);
-
-    // name
-    label = lv_label_create(content, NULL);
-    lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
-    lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
-       lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL);
-       lv_obj_set_width(label, lv_obj_get_width(content) - 20);
-    if(strlen(s_video_call_params.name) > 0) 
-       {
-        lv_label_set_text(label, s_video_call_params.name);
-    } 
-       else 
-       {
-        lv_label_set_text(label, s_video_call_params.number);
-    }
-       lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
-    lv_obj_set_click(label, false);
-
-    // btn ring off
-    lv_obj_t * btn;
-    btn = lv_imgbtn_create(content, NULL);
-    lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN);
-    lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN);
-    lv_obj_set_event_cb(btn, mmi_video_call_phone_ring_off_action);
-    lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_LEFT, 20, -30);
-
-    // btn ring hook
-    btn = lv_imgbtn_create(content, NULL);
-    lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_ANSWER_BTN);
-    lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_ANSWER_BTN);
-    lv_obj_set_event_cb(btn, voip_ring_hook_action);
-    lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_RIGHT, -20, -30);
-}
-
-static void mmi_video_call_phone_connected(lv_obj_t * content)
-{
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       
-    lv_voip_phone_obj_ext_t * ext = voip_phone_get_ext();
-
-    LV_ASSERT_MEM(ext);
-    if(ext == NULL) {
-        return;
-    }
-
-    if(s_video_call_params.voip_call_type == MODEM_VIDEO_CALL_TYPE_VOICE) 
-       {
-               VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               
-        hal_rtc_t rtc_curr;                    // current rtc time
-        Hal_Rtc_Gettime(&rtc_curr);
-        ext->connect_start_time = time_to_seconds(&rtc_curr);
-
-               ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_NULL;
-
-        //lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
-        lv_obj_t * img = lv_img_create(content, NULL);
-               lv_img_set_src(img, ICON_VIDEO_CALL_CONTACT_PHOTO);
-               lv_obj_align(img, content, LV_ALIGN_IN_TOP_MID, 0, 10);
-               lv_obj_set_click(img, false);
-               
-        // name
-               lv_obj_t * label = lv_label_create(content, NULL);
-               lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
-               lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
-               lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL);
-               lv_obj_set_width(label, lv_obj_get_width(content) - 20);
-               if(strlen(s_video_call_params.name) > 0) 
-               {
-                       lv_label_set_text(label, s_video_call_params.name);
-               } 
-               else 
-               {
-                       lv_label_set_text(label, s_video_call_params.number);
-               }
-               lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
-               lv_obj_set_click(label, false);
-
-               //duration
-               lv_obj_t * time_label = lv_label_create(content, NULL);
-               lv_obj_add_style(time_label, LV_OBJ_PART_MAIN, &lv_watch_font20);
-               lv_label_set_align(time_label, LV_LABEL_ALIGN_CENTER);
-               lv_label_set_text(time_label, "00:00");
-               lv_obj_set_click(time_label, false);
-               lv_obj_set_base_dir(time_label, LV_BIDI_DIR_LTR);
-               lv_obj_align(time_label, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
-               ext->phone_status_label = time_label;
-
-               //btn volume
-               lv_obj_t * btn;
-               btn = lv_imgbtn_create(content, NULL);
-               lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_PHONE_RING_VOLUME);
-               lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_PHONE_RING_VOLUME);
-               lv_obj_set_event_cb(btn, voip_volume_btn_action);
-               lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_LEFT, 20, -50);
-
-               //btn ring off
-               btn = lv_imgbtn_create(content, NULL);
-               lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_PHONE_RING_OFF);
-               lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_PHONE_RING_OFF);
-               lv_obj_set_event_cb(btn, mmi_video_call_phone_ring_off_action);
-               lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_RIGHT, -20, -50);
-    } 
-       else
-       {
-        lv_obj_t * canvas;
-        lv_obj_t * label;
-        lv_obj_t * btn;
-
-               VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: format=%d\n", __FUNCTION__, __LINE__, ext->voiph263fmt);
-
-        ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_REMOTE;
-        if((ext->voiph263fmt == VOIP_H263_FMT_SQCIF) || (ext->voiph263fmt == VOIP_H263_FMT_QCIF)) 
-               {
-            hal_rtc_t rtc_curr;                        // current rtc time
-            Hal_Rtc_Gettime(&rtc_curr);
-            ext->connect_start_time = time_to_seconds(&rtc_curr);
-
-            lv_obj_t * cont = voip_phone_cont_create(content, LV_LAYOUT_OFF, &lv_watch_style_transp, -1);
-            lv_obj_set_width(cont, lv_obj_get_width(content));
-            lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
-
-            /*Create the canvas object*/
-            canvas = lv_canvas_create(cont, NULL);
-            lv_obj_set_click(canvas, true);
-            lv_obj_set_event_cb(canvas, canvas_button_hidden_event_cb);
-            video_call_add_element(canvas);
-            ext->canvas = canvas;
-
-            lv_obj_align(canvas, cont, LV_ALIGN_IN_TOP_MID, 0, 0);
-            /*Assign the buffer to the canvas*/
-            lv_img_set_src(canvas, ICON_VIDEO_CALL);
-            voip_signal_check_start(ext);
-
-            // duration
-            label = lv_label_create(canvas, NULL);
-            lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20);
-            lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
-            lv_label_set_text(label, "0:0");
-            lv_obj_set_click(label, false);
-            lv_obj_set_base_dir(label, LV_BIDI_DIR_LTR);
-            if(LV_BIDI_DIR_RTL == lv_obj_get_base_dir(content)) {
-                lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_RIGHT, -lv_obj_get_width(label), 0);
-            }
-            ext->phone_status_label = label;
-
-            // signal weak notification
-            label = lv_label_create(canvas, NULL);
-            lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font30);
-            lv_label_set_text_id(label, WATCH_TEXT_ID_SIGNAL_WEAK);
-            lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
-            lv_obj_align(label, canvas, LV_ALIGN_CENTER, 0, -10);
-            lv_obj_set_click(label, false);
-            lv_obj_set_hidden(label, true);
-            ext->signal_weak_label = label;
-
-            cont = voip_phone_cont_create(content, LV_LAYOUT_OFF, &lv_watch_style_transp, lv_obj_get_width(content) - 40);
-            // btn volume
-            btn = lv_imgbtn_create(cont, NULL);
-            lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_PHONE_RING_VOLUME);
-            lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_PHONE_RING_VOLUME);
-            lv_obj_set_event_cb(btn, voip_volume_btn_action);
-            lv_obj_align(btn, cont, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
-
-            // btn switch video
-            btn = lv_imgbtn_create(cont, NULL);
-            lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_SETTING_VOLTE);
-            lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_SETTING_VOLTE);
-            lv_obj_set_event_cb(btn, voip_local_remote_switch_action);
-            lv_obj_align(btn, cont, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
-
-            // btn ring off
-            btn = lv_imgbtn_create(cont, NULL);
-            lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_PHONE_RING_OFF);
-            lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_PHONE_RING_OFF);
-            lv_obj_set_event_cb(btn, mmi_video_call_phone_ring_off_action);
-            lv_obj_align(btn, cont, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0);
-        } 
-               else if((ext->voiph263fmt == VOIP_H263_FMT_CIF)
-                  || (ext->voiph263fmt == VOIP_H263_FMT_4CIF)
-                  || (ext->voiph263fmt == VOIP_H263_FMT_16CIF)
-                  || (ext->voiph263fmt == VOIP_H263_FMT_OTHER)) 
-               {
-            /*Create the canvas object*/
-            canvas = lv_canvas_create(content, NULL);
-            lv_obj_set_click(canvas, true);
-            lv_obj_set_event_cb(canvas, canvas_button_hidden_event_cb);
-            video_call_add_element(canvas);
-            ext->canvas = canvas;
-
-            /*Assign the buffer to the canvas*/
-            lv_img_set_src(canvas, ICON_VIDEO_CALL);
-            voip_signal_check_start(ext);
-
-            // duration
-            label = lv_label_create(canvas, NULL);
-            lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20);
-            lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
-            lv_label_set_text(label, "0:0");
-            lv_obj_set_click(label, false);
-            lv_obj_set_base_dir(label, LV_BIDI_DIR_LTR);
-            if(LV_BIDI_DIR_RTL == lv_obj_get_base_dir(content)) {
-                lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_RIGHT, -lv_obj_get_width(label), 0);
-            }
-            ext->phone_status_label = label;
-            ext->connect_time       = label;
-
-            // signal weak notification
-            label = lv_label_create(canvas, NULL);
-            lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font30);
-            lv_label_set_text_id(label, WATCH_TEXT_ID_SIGNAL_WEAK);
-            lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
-            lv_obj_align(label, canvas, LV_ALIGN_CENTER, 0, -10);
-            lv_obj_set_click(label, false);
-            lv_obj_set_hidden(label, true);
-            ext->signal_weak_label = label;
-
-            // btn volume
-            btn = lv_imgbtn_create(canvas, NULL);
-            lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_PHONE_RING_VOLUME);
-            lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_PHONE_RING_VOLUME);
-            lv_obj_set_event_cb(btn, voip_volume_btn_action);
-            lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_LEFT, 0, -20);
-            lv_obj_add_style(btn, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
-            ext->ring_value_button = btn;
-
-            // btn switch video
-            btn = lv_imgbtn_create(canvas, NULL);
-            lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_SETTING_VOLTE);
-            lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_SETTING_VOLTE);
-            lv_obj_set_event_cb(btn, voip_local_remote_switch_action);
-            lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_MID, 0, -20);
-            lv_obj_add_style(btn, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
-            ext->view_switch_button = btn;
-
-            // btn ring off
-            btn = lv_imgbtn_create(canvas, NULL);
-            lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_PHONE_RING_OFF);
-            lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_PHONE_RING_OFF);
-            lv_obj_set_event_cb(btn, mmi_video_call_phone_ring_off_action);
-            lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_RIGHT, 0, -20);
-            lv_obj_add_style(btn, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
-            ext->ring_off_button = btn;
-
-            lv_obj_set_hidden(ext->connect_time, ext->canvas_button_hidden_flag);
-            lv_obj_set_hidden(ext->ring_value_button, ext->canvas_button_hidden_flag);
-            lv_obj_set_hidden(ext->view_switch_button, ext->canvas_button_hidden_flag);
-            lv_obj_set_hidden(ext->ring_off_button, ext->canvas_button_hidden_flag);
-        }
-
-        if(voip_phone_get_obj()) {
-            lv_watch_obj_set_down_slide_cb(voip_phone_get_obj(), voip_phone_down_slide_callback);
-        }
-    }
-}
-
-static void voip_phone_prepare_destory(lv_obj_t * activity_obj)
-{
-    printf("%s %d\n", __FUNCTION__, __LINE__);
-
-    lv_watch_png_cache_all_free();
-
-    // stop playing tone
-    Hal_Tone_Play_End();
-
-    // ring off
-    mmi_video_call_phone_ring_off_action(NULL, LV_EVENT_CLICKED);
-
-    // stop ring off timer
-    if(NULL != s_video_call_params.ring_off_timer_id) {
-        Hal_Timer_Stop(s_video_call_params.ring_off_timer_id);
-        s_video_call_params.ring_off_timer_id = NULL;
+    // stop ring off timer
+    if(NULL != s_video_call_params.ring_off_timer_id) {
+        Hal_Timer_Stop(s_video_call_params.ring_off_timer_id);
+        s_video_call_params.ring_off_timer_id = NULL;
     }
 
     // stop callreq timer
@@ -1218,7 +609,7 @@ static void voip_phone_prepare_destory(lv_obj_t * activity_obj)
     }
 
     Hal_Mem_Set(&s_video_call_params, 0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
-    s_video_call_params.state = MMI_VOIP_CALL_STATE_NULL;
+    s_video_call_params.state = MMI_VIDEO_CALL_STATE_NONE;
 }
 
 static void voip_get_time_elaps(uint32_t last_time, char * str, int8_t size)
@@ -1250,126 +641,44 @@ static void voip_get_time_elaps(uint32_t last_time, char * str, int8_t size)
     }
 }
 
-#if VOIP_PHONE_TEST != 0
-
-static void watch_voip_call_response_originating(int32_t index)
+void mmi_vc_ring_off_no_carrier(uint8_t isNoCarrier)
 {
-    printf("%s %d\n", __FUNCTION__, __LINE__);
-
-    if(MMI_VOIP_CALL_STATE_DIALING == s_video_call_params.state) {
+    if((false == s_video_call_params.ring_off_timeout)
+            && (1 == isNoCarrier)
+            && (MMI_VIDEO_CALL_STATE_NONE == s_video_call_params.state)) 
+    {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: \n", __FUNCTION__, __LINE__);
         return;
     }
 
-    printf("%s: %d\n", __func__, index);
-    s_video_call_params.index = index;
-
-    // state: NULL -> DIALLING
-    s_video_call_params.state = MMI_VOIP_CALL_STATE_DIALING;
-}
-#endif
-
-void watch_voip_call_response_alerting(int32_t index)
-{
-    printf("%s %d index is %d\n", __FUNCTION__, __LINE__, index);
-    if(MMI_VOIP_CALL_STATE_ALERTING == s_video_call_params.state) {
-        return;
-    }
-
-    uint8_t volume;
-
-    // state: DIALLING -> ALERTING
-    s_video_call_params.state = MMI_VOIP_CALL_STATE_ALERTING;
-
-    // set speaker volume
-    UI_NV_Read_Req(NV_SECTION_UI_PHONE, VOIP_PHONE_NV_VOLUME_OFFSET, 1, &volume);
-    if(!Hal_Set_BT_Audio_Path((HAL_SPEAKER_GAIN)volume))
-        Hal_Call_Speaker(HAL_CALL_SPK_ON, (HAL_SPEAKER_GAIN)volume);
-}
-
-void watch_voip_call_response_ring(int32_t index)
-{
-    printf("%s: %d\n", __func__, index);
-    Hal_NFFS_File_Play_Repeat(AUDIO_INCOMING_CALL, query_current_volume());
-
-    s_video_call_params.state = MMI_VOIP_CALL_STATE_ALERTING;
-}
-
-void watch_voip_call_response_connect(int32_t index)
-{
-    printf("%s %d index is %d\n", __FUNCTION__, __LINE__, index);
-    if(MMI_VOIP_CALL_STATE_ACTIVE == s_video_call_params.state) {
-        return;
-    }
-
-    s_video_call_params.state = MMI_VOIP_CALL_STATE_ACTIVE;
-
-    // stop callreq timer
-    if(NULL != s_video_call_params.callreq_timer_id) {
-        Hal_Timer_Stop(s_video_call_params.callreq_timer_id);
-        s_video_call_params.callreq_timer_id = NULL;
-    }
-
-    // stop playing tone
-    Hal_Tone_Play_End();
-
-    Hal_Set_Voice_Call_Status(VOICE_CALL_START);
-
-    // create connected UI
-    mmi_video_call_phone_create(NULL, VOIP_PHONE_UI_CONNECTED);
-}
-
-void watch_voip_call_response_disconnect(int32_t index)
-{
-    // not used
-    (void)index;
-    printf("%s: %d\n", __func__, index);
-    Hal_Tone_Play_End();
-
-    // create ring off UI
-    if(voip_phone_get_activity_obj()) {
-        mmi_video_call_phone_ring_off_create();
-        // remove donw slider handle
-        lv_watch_obj_set_down_slide_cb(voip_phone_get_obj(), NULL);
-    }
-    Hal_Mem_Set(&s_video_call_params, 0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
-    s_video_call_params.state = MMI_VOIP_CALL_STATE_NULL;
-}
-
-void watch_voip_call_response_no_carrier(int32_t index, uint8_t isNoCarrier)
-{
-    printf("%s: %d\n", __func__, __LINE__);
-
-    if((false == s_video_call_params.ring_off_timeout)
-            && (1 == isNoCarrier)
-            && (MMI_VOIP_CALL_STATE_NULL == s_video_call_params.state)) {
-        printf("%s: ignore no carrier in state NULL\n", __func__);
-        return;
-    }
-
-    printf("%s: %d\n", __func__, index);
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: \n", __FUNCTION__, __LINE__);
 
     // stop playing tone
     Hal_Tone_Play_End();
 
     // stop ring off timer
-    if(NULL != s_video_call_params.ring_off_timer_id) {
+    if(NULL != s_video_call_params.ring_off_timer_id) 
+       {
         Hal_Timer_Stop(s_video_call_params.ring_off_timer_id);
         s_video_call_params.ring_off_timer_id = NULL;
     }
 
     // stop callreq timer
-    if(NULL != s_video_call_params.callreq_timer_id) {
+    if(NULL != s_video_call_params.callreq_timer_id) 
+       {
         Hal_Timer_Stop(s_video_call_params.callreq_timer_id);
         s_video_call_params.callreq_timer_id = NULL;
     }
 
     // create ring off UI
     lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE);
-    if(activity_obj) {
+    if(activity_obj) 
+       {
         mmi_video_call_phone_ring_off_create();
     }
 
-    if(MMI_MODEM_CALL_STATE_NULL != phone_get_call_state()) {
+    if(MMI_MODEM_CALL_STATE_NULL != phone_get_call_state()) 
+       {
         printf("%s tele call is on going, keep para of audio\n", __FUNCTION__);
         Hal_Set_Voice_Call_Status(VOICE_CALL_END);
         Hal_Disconnect_BT_Audio_Path();
@@ -1378,119 +687,7 @@ void watch_voip_call_response_no_carrier(int32_t index, uint8_t isNoCarrier)
     watch_wakeup_time_reset();
 
     Hal_Mem_Set(&s_video_call_params, 0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
-    s_video_call_params.state = MMI_VOIP_CALL_STATE_NULL;
-} /* watch_voip_call_response_no_carrier */
-
-void watch_voip_call_response_state_change(MMI_Modem_Call_Response_State_Change_t * state)
-{
-    printf("%s %d\n", __FUNCTION__, __LINE__);
-
-    for(uint8_t i = 0; i < state->count; i++) {
-        Hal_Mem_Free(state->calls[i].number);
-        Hal_Mem_Free(state->calls[i].name);
-    }
-    Hal_Mem_Free(state->calls);
-    Hal_Mem_Free(state);
-}
-
-void watch_voip_call_response_bottom_error(void)
-{
-    printf("%s %d\n", __FUNCTION__, __LINE__);
-    voip_phone_cleanup();
-    Hal_Mem_Set(&s_video_call_params, 0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
-}
-
-void watch_voip_call_response_bottom_need_redail(void)
-{
-    printf("%s %d\n", __FUNCTION__, __LINE__);
-    //voip_call_dial_req(s_video_call_params.voip_call_type, s_video_call_params.number);
-}
-
-void watch_voip_incomingcall_response(char * number, int32_t calltype)
-{
-    uint8_t                  volume;
-    voip_phonebook_contact_t * contact_info = NULL;
-
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__, number, calltype);
-
-    if((MMI_MODEM_CALL_STATE_NULL != phone_get_call_state()) || is_rat_gsm()) {
-        printf("tele call is on going  %d or in gsm mode, reject voip call\n", phone_get_call_state());
-        mmi_video_call_reject_req(TRUE);
-        return;
-    }
-
-    Hal_Mem_Set(&s_video_call_params, 0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
-    s_video_call_params.voip_call_type = (MODEM_VIDEO_CALL_TYPE)calltype;
-    s_video_call_params.is_mt          = true;
-    s_video_call_params.state          = MMI_VOIP_CALL_STATE_INCOMING;
-    strncpy(s_video_call_params.number, number, NV_CONTACTS_MAX_NUMBER_LEN);
-       
-    //Hal_Mem_Free(number);
-
-    if(1) 
-       {
-        if(AUDIO_CTRL_PRIORITY_2 == Hal_Audio_Manage_Start_Req(AUDIO_CTRL_PRIORITY_2,voip_audio_ctrl_callback))
-        {
-            watch_set_lcd_status(true);
-            // set speaker volume
-
-            UI_NV_Read_Req(NV_SECTION_UI_PHONE, VOIP_PHONE_NV_VOLUME_OFFSET, 1, &volume);
-            if(!Hal_Set_BT_Audio_Path((HAL_SPEAKER_GAIN)volume))
-                Hal_Call_Speaker(HAL_CALL_SPK_ON, (HAL_SPEAKER_GAIN)volume);
-
-            // play tone
-            Hal_NFFS_File_Play_Repeat(AUDIO_INCOMING_CALL, query_current_volume());
-
-            // start rat checking
-            voip_rat_check_start();
-
-            // create ring UI
-            mmi_video_call_phone_create(NULL, VOIP_PHONE_UI_INCOMING);
-        }
-        else
-        { // AUDIO_CTRL_PRIORITY_1
-            printf("%s: phone call has been run, auto reject\n", __func__);
-            // auto reject
-            mmi_video_call_reject_req(FALSE);
-            voip_signal_check_stop();
-            voip_rat_check_stop();
-
-            // stop ring off timer
-            if(NULL != s_video_call_params.ring_off_timer_id) {
-                Hal_Timer_Stop(s_video_call_params.ring_off_timer_id);
-                s_video_call_params.ring_off_timer_id = NULL;
-            }
-
-            // stop callreq timer
-            if(NULL != s_video_call_params.callreq_timer_id) {
-                Hal_Timer_Stop(s_video_call_params.callreq_timer_id);
-                s_video_call_params.callreq_timer_id = NULL;
-            }
-
-            Hal_Mem_Set(&s_video_call_params, 0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
-            s_video_call_params.state = MMI_VOIP_CALL_STATE_NULL;
-            voip_set_volume_when_slider_act();
-            voip_phone_cleanup();
-            lv_watch_png_cache_all_free();
-            Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
-        }
-    } else {
-        printf("%s: not a contact, auto reject\n", __func__);
-        // auto reject
-        mmi_video_call_reject_req(TRUE);
-
-#if VOIP_PHONE_TEST
-        watch_voip_call_response_no_carrier(s_video_call_params.index, 0);
-#endif
-    }
-} /* watch_voip_incomingcall_response */
-
-void watch_ui_voip_message_handle(void * msg)
-{
-}
-
-void watch_voip_autotest_handle(void * testmsg)
-{
+    s_video_call_params.state = MMI_VIDEO_CALL_STATE_NONE;
 }
 
 static bool mmi_video_call_check_mo_permission(void)
@@ -1583,186 +780,834 @@ static void video_call_add_element(lv_obj_t * element)
     lv_obj_add_protect(element, LV_PROTECT_PRESS_LOST | LV_PROTECT_CLICK_FOCUS);
 }
 
-static void canvas_button_hidden_event_cb(lv_obj_t * obj, lv_event_t e)
-{
-    if(LV_EVENT_CLICKED == e) 
-       {
-        printf("%s %d\n", __FUNCTION__, __LINE__);
-        lv_voip_phone_obj_ext_t * ext = voip_phone_get_ext();
-        if(!ext) {
-            return;
-        }
-        if(ext->canvas_button_hidden_flag == NOT_HIDDEN) {
-            ext->canvas_button_hidden_flag = HIDDEN;
-        } else {
-            ext->canvas_button_hidden_flag = NOT_HIDDEN;
+static void canvas_button_hidden_event_cb(lv_obj_t * obj, lv_event_t e)
+{
+    if(LV_EVENT_CLICKED == e) 
+       {
+        printf("%s %d\n", __FUNCTION__, __LINE__);
+        lv_voip_phone_obj_ext_t * ext = voip_phone_get_ext();
+        if(!ext) {
+            return;
+        }
+        if(ext->canvas_button_hidden_flag == NOT_HIDDEN) {
+            ext->canvas_button_hidden_flag = HIDDEN;
+        } else {
+            ext->canvas_button_hidden_flag = NOT_HIDDEN;
+        }
+
+        lv_obj_set_hidden(ext->connect_time, ext->canvas_button_hidden_flag);
+        lv_obj_set_hidden(ext->ring_value_button, ext->canvas_button_hidden_flag);
+        lv_obj_set_hidden(ext->view_switch_button, ext->canvas_button_hidden_flag);
+        lv_obj_set_hidden(ext->ring_off_button, ext->canvas_button_hidden_flag);
+    }
+}
+
+static void voip_set_volume_when_slider_act(void)
+{
+    printf("%s\n", __FUNCTION__);
+    if(lv_watch_get_activity_obj(ACT_ID_SLIDER)) {
+        if(MMI_VIDEO_CALL_STATE_NONE != s_video_call_params.state) {
+            uint8_t volume = voip_get_call_volume();
+            printf("set nv, speaker volume is %d.\n", volume);
+            UI_NV_Write_Req(NV_SECTION_UI_PHONE, 0, 1, &volume);
+        }
+    }
+}
+
+#if VIDEO_SIGNAL_CHECK
+static void signal_check(lv_task_t *task)
+{
+    lv_voip_phone_obj_ext_t * ext = voip_phone_get_ext();
+    if(!ext) return;
+
+    if((false == is_rat_gsm()) &&
+       (watch_modem_get_signal_bar_req() < MMI_MODEM_SIGNAL_BAR_3)) {
+        lv_obj_set_hidden(ext->signal_weak_label, false);
+    } else {
+        lv_obj_set_hidden(ext->signal_weak_label, true);
+    }
+}
+#endif
+
+static void voip_signal_check_start(void * ext)
+{
+#if VIDEO_SIGNAL_CHECK
+    if(NULL == signal_check_task)
+        signal_check_task = lv_task_create(signal_check, VIDEO_SIGNAL_CHECK_PERIOD, LV_TASK_PRIO_HIGH, NULL);
+#endif
+}
+
+static void voip_signal_check_stop(void)
+{
+#if VIDEO_SIGNAL_CHECK
+    if(signal_check_task) {
+        lv_task_del(signal_check_task);
+        signal_check_task = NULL;
+    }
+#endif
+}
+
+static bool is_rat_gsm(void)
+{
+    MMI_MODEM_PLMN_RAT rat;
+
+    watch_modem_get_operator_req(&rat);
+    if(MMI_MODEM_PLMN_RAT_GSM == rat)
+        return true;
+    else
+        return false;
+}
+
+static void rat_check(lv_task_t *task)
+{
+    if(is_rat_gsm()) {
+        mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);
+    }
+}
+
+static void voip_rat_check_start(void)
+{
+    if(NULL == rat_check_task)
+        rat_check_task = lv_task_create(rat_check, VIDEO_RAT_CHECK_PERIOD, LV_TASK_PRIO_HIGH, NULL);
+}
+
+static void voip_rat_check_stop(void)
+{
+    if(rat_check_task) {
+        lv_task_del(rat_check_task);
+        rat_check_task = NULL;
+    }
+}
+
+void voip_fps_check(int8_t fps)
+{
+    lv_voip_phone_obj_ext_t * ext = voip_phone_get_ext();
+    if(NULL != ext) {
+        if((VIDEO_CALL_FPS_CHECK_LIMIT >= fps) && (0 != fps)) {
+            printf("%s %d\n", __FUNCTION__, fps);
+            if(lv_obj_get_hidden(ext->signal_weak_label) == false) return;
+            lv_obj_set_hidden(ext->signal_weak_label, false);
+        } else {
+            if(lv_obj_get_hidden(ext->signal_weak_label) == true) return;
+            lv_obj_set_hidden(ext->signal_weak_label, true);
+        }
+    }
+}
+
+
+
+#ifdef __VIDEO_CALL_TEST__
+#define MMI_VC_ROOM_ID "jrtc001" // "104799"
+#endif
+
+static nv_watch_vc_contact_t s_vc_contact = {0};
+static TIMER_ID fail_timer_id = NULL;
+
+char * mmi_video_call_params_number_get(void)
+{
+       return (s_video_call_params.number);
+}
+
+MMI_VIDEO_CALL_STATE_E mmi_video_call_params_state_get(void)
+{
+       return (s_video_call_params.state);
+}
+
+MODEM_VIDEO_CALL_TYPE mmi_video_call_params_type_get(void)
+{
+       return (s_video_call_params.call_type);
+}
+
+
+
+void mmi_video_call_contact_nv_write(void)
+{
+       uint32_t nv_data_length = sizeof(nv_watch_vc_contact_t);
+       
+       if(nv_data_length != UI_NV_Write_Req(NV_SECTION_UI_VC_CONTACT, 0, nv_data_length, (uint8_t *)&s_vc_contact))
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: nv write fail\n", __FUNCTION__, __LINE__);
+       }
+}
+
+void mmi_video_call_contact_nv_read(void)
+{
+       uint32_t nv_data_length = sizeof(nv_watch_vc_contact_t);
+       
+       if(nv_data_length != UI_NV_Read_Req(NV_SECTION_UI_VC_CONTACT, 0, nv_data_length, (uint8_t *)&s_vc_contact))
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: nv read fail\n", __FUNCTION__, __LINE__);
+       }
+}
+
+void mmi_vc_contact_set(nv_watch_vc_contact_t * contact_list)
+{
+    if(NULL == contact_list) 
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: \n", __FUNCTION__, __LINE__);
+        return;
+    }
+
+       _lv_memcpy(&s_vc_contact, contact_list, sizeof(nv_watch_vc_contact_t));
+       mmi_video_call_contact_nv_write();
+
+
+    //phonebook_update_ui(contact_list, count, 0, 0);
+
+}
+
+// state: 0-hang up or reject; 1-accepte; 2-dial
+void mmi_vc_call_operate_send_to_server(uint_8 flag)
+{
+       if(0 == flag)
+               mmi_protocol_fzd_action_VC_CALL_RESPONSE(s_video_call_params.number, 0);
+       else if(1 == flag)
+               mmi_protocol_fzd_action_VC_CALL_RESPONSE(s_video_call_params.number, 1);
+       else if(2 == flag)
+               mmi_protocol_fzd_action_VC_CALL_REQUEST(s_video_call_params.number, s_video_call_params.call_type);
+}
+
+static void mmi_vc_incoming_hook_action(lv_obj_t * btn, lv_event_t e)
+{
+    if(LV_EVENT_CLICKED != e) 
+       {
+        return;
+    }
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    if(btn) {
+        lv_obj_set_click(btn, false);
+    }
+
+    Hal_Tone_Play_End();
+       
+    int8_t ret = mmi_video_call_answer_req();
+    if(ret < 0) {
+        mmi_vc_ring_off_no_carrier(0);
+    }
+}
+
+
+lv_res_t mmi_video_call_phone_ring_off_create()
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    lv_voip_phone_obj_ext_t * ext = voip_phone_get_ext();
+    LV_ASSERT_MEM(ext);
+    if(ext == NULL) {
+        return(LV_RES_INV);
+    }
+
+    // stop callreq timer
+    if(NULL != s_video_call_params.callreq_timer_id) {
+        Hal_Timer_Stop(s_video_call_params.callreq_timer_id);
+        s_video_call_params.callreq_timer_id = NULL;
+    }
+
+    if(ext->phone_ui_t == MMI_VC_UI_INCOMING || ext->phone_ui_t == MMI_VC_UI_DIALING) {
+        if(ext->phone_status_label) {
+            lv_label_set_text(ext->phone_status_label, "");
+        }
+
+        voip_ring_off_content_create(voip_phone_get_obj());
+    } else if(ext->phone_ui_t == PHONE_UI_CONNECTED) {
+        voip_ring_off_content_create(voip_phone_get_obj());
+    }
+
+    if(ext->phone_animation_obj) {
+        lv_obj_del(ext->phone_animation_obj);
+        ext->phone_animation_obj = NULL;
+    }
+
+    /* set speaker volume to nv when leaving activiry's slider */
+    voip_set_volume_when_slider_act();
+
+    /* phone cleanup when anim end*/
+    lv_anim_t a;
+    lv_anim_init(&a);
+    lv_anim_set_var(&a, voip_phone_get_obj());
+    lv_anim_set_ready_cb(&a, (lv_anim_ready_cb_t)voip_phone_obj_hide_anim_end);
+    lv_anim_set_time(&a, VOIP_PHONE_RING_OFF_CONTINUE_TIME);
+    lv_anim_start(&a);
+
+    voip_signal_check_stop();
+    voip_rat_check_stop();
+
+    return(LV_RES_OK);
+}
+
+static void mmi_vc_ring_off_timeout_cb(void * para)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+    s_video_call_params.ring_off_timer_id = NULL;
+    s_video_call_params.ring_off_timeout  = true;
+    mmi_vc_ring_off_no_carrier(0);
+}
+
+void mmi_vc_ring_off_action(lv_obj_t * btn, lv_event_t e)
+{
+    if(LV_EVENT_CLICKED != e) 
+       {
+        return;
+    }
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: %d\n", __FUNCTION__, __LINE__, s_video_call_params.state);
+
+    if(false == s_video_call_params.ring_off) 
+       {
+        s_video_call_params.ring_off = true;
+
+        if(NULL == s_video_call_params.ring_off_timer_id) {
+            s_video_call_params.ring_off_timer_id = Hal_Timer_Start(VOIP_RING_OFF_TIMER_LEN, mmi_vc_ring_off_timeout_cb, NULL, 0);
+        }
+        // stop callreq timer
+        if(NULL != s_video_call_params.callreq_timer_id) {
+            Hal_Timer_Stop(s_video_call_params.callreq_timer_id);
+            s_video_call_params.callreq_timer_id = NULL;
+        }
+    }
+
+    switch(s_video_call_params.state) 
+       {
+        case MMI_VIDEO_CALL_STATE_NONE:
+        case MMI_VIDEO_CALL_STATE_INVALID:
+            // do noting
+            break;
+
+        case MMI_VIDEO_CALL_STATE_CALLING:
+            mmi_video_call_hangup_req(TRUE);
+            break;
+
+        case MMI_VIDEO_CALL_STATE_INCOMING:
+            Hal_Tone_Play_End();
+            mmi_video_call_reject_req(TRUE);
+            break;
+
+        default:
+            mmi_video_call_hangup_req(TRUE);
+            break;
+       }
+
+    voip_signal_check_stop();
+    voip_rat_check_stop();
+}
+
+static void mmi_vc_ui_dialing(lv_obj_t * content)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    lv_voip_phone_obj_ext_t * ext = voip_phone_get_ext();
+    if(ext == NULL) {
+        return;
+    }
+
+    // label dialing
+    lv_obj_t * label = lv_label_create(content, NULL);
+    lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20);
+    lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+    lv_label_set_text_id(label, WATCH_TEXT_ID_DAILING);
+    lv_obj_set_click(label, false);
+       lv_obj_align(label, content, LV_ALIGN_IN_TOP_MID, 0, 10);
+    ext->phone_status_label = label;
+
+    // img
+    lv_obj_t * img = lv_img_create(content, NULL);
+       lv_img_set_src(img, ICON_VIDEO_CALL_CONTACT_PHOTO);
+       lv_obj_align(img, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
+    lv_obj_set_click(img, false);
+
+    // name
+    label = lv_label_create(content, NULL);
+    lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+    lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+       lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL);
+       lv_obj_set_width(label, lv_obj_get_width(content) - 20);
+    if(strlen(s_video_call_params.name) > 0) 
+       {
+        lv_label_set_text(label, s_video_call_params.name);
+    } 
+       else 
+       {
+        lv_label_set_text(label, s_video_call_params.number);
+    }
+       lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
+    lv_obj_set_click(label, false);
+
+       #if 0
+    // btn volume
+    lv_obj_t * btn;
+    btn = lv_imgbtn_create(cont, NULL);
+    lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_PHONE_RING_VOLUME);
+    lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_PHONE_RING_VOLUME);
+    lv_obj_set_event_cb(btn, voip_volume_btn_action);
+    lv_obj_align(btn, cont, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
+       #endif
+
+    // btn ring off
+    lv_obj_t * btn = lv_imgbtn_create(content, NULL);
+    lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN);
+    lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN);
+    lv_obj_set_event_cb(btn, mmi_vc_ring_off_action);
+    lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_MID, 0, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+}
+
+static void mmi_vc_ui_incoming(lv_obj_t * content)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    lv_voip_phone_obj_ext_t * ext = voip_phone_get_ext();
+
+    LV_ASSERT_MEM(ext);
+    if(ext == NULL) {
+        return;
+    }
+    lv_obj_t * label;
+
+    // label ringing
+    label = lv_label_create(content, NULL);
+    lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20);
+    lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+    lv_label_set_text_id(label, WATCH_TEXT_ID_RINGING);
+    lv_obj_set_click(label, false);
+    ext->phone_status_label = label;
+
+    // img
+    lv_obj_t * img = lv_img_create(content, NULL);
+       lv_img_set_src(img, ICON_VIDEO_CALL_CONTACT_PHOTO);
+       lv_obj_align(img, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
+    lv_obj_set_click(img, false);
+
+    // name
+    label = lv_label_create(content, NULL);
+    lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+    lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+       lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL);
+       lv_obj_set_width(label, lv_obj_get_width(content) - 20);
+    if(strlen(s_video_call_params.name) > 0) 
+       {
+        lv_label_set_text(label, s_video_call_params.name);
+    } 
+       else 
+       {
+        lv_label_set_text(label, s_video_call_params.number);
+    }
+       lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
+    lv_obj_set_click(label, false);
+
+    // btn ring off
+    lv_obj_t * btn;
+    btn = lv_imgbtn_create(content, NULL);
+    lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN);
+    lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN);
+    lv_obj_set_event_cb(btn, mmi_vc_ring_off_action);
+    lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_LEFT, MMI_VC_INCOMING_RING_OFF_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+
+    // btn ring hook
+    btn = lv_imgbtn_create(content, NULL);
+    lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_ANSWER_BTN);
+    lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_ANSWER_BTN);
+    lv_obj_set_event_cb(btn, mmi_vc_incoming_hook_action);
+    lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_VC_INCOMING_HOOK_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+}
+
+static void mmi_vc_ui_connected(lv_obj_t * content)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+    lv_voip_phone_obj_ext_t * ext = voip_phone_get_ext();
+    if(ext == NULL) 
+       {
+        return;
+    }
+
+       lv_obj_t * label;
+       lv_obj_t * btn;
+       hal_rtc_t rtc_curr = {0};                                  // current rtc time
+       Hal_Rtc_Gettime(&rtc_curr);
+       
+    if(s_video_call_params.call_type == MODEM_VIDEO_CALL_TYPE_VOICE) 
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               
+        ext->connect_start_time = time_to_seconds(&rtc_curr);
+
+               ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_NULL;
+
+        //lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
+        lv_obj_t * img = lv_img_create(content, NULL);
+               lv_img_set_src(img, ICON_VIDEO_CALL_CONTACT_PHOTO);
+               lv_obj_align(img, content, LV_ALIGN_IN_TOP_MID, 0, 30);
+               lv_obj_set_click(img, false);
+               
+        // name
+               label = lv_label_create(content, NULL);
+               lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+               lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+               lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL);
+               lv_obj_set_width(label, lv_obj_get_width(content) - 20);
+               if(strlen(s_video_call_params.name) > 0) 
+               {
+                       lv_label_set_text(label, s_video_call_params.name);
+               } 
+               else 
+               {
+                       lv_label_set_text(label, s_video_call_params.number);
+               }
+               lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
+               lv_obj_set_click(label, false);
+
+               //duration
+               lv_obj_t * time_label = lv_label_create(content, NULL);
+               lv_obj_add_style(time_label, LV_OBJ_PART_MAIN, &lv_watch_font20);
+               lv_label_set_align(time_label, LV_LABEL_ALIGN_CENTER);
+               lv_label_set_text(time_label, "00:00");
+               lv_obj_set_click(time_label, false);
+               lv_obj_set_base_dir(time_label, LV_BIDI_DIR_LTR);
+               lv_obj_align(time_label, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
+               ext->phone_status_label = time_label;
+
+               //btn volume
+               btn = lv_imgbtn_create(content, NULL);
+               lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VOLUME_BTN);
+               lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VOLUME_BTN);
+               lv_obj_set_event_cb(btn, voip_volume_btn_action);
+               lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_LEFT, MMI_VC_CALLING_VOLUME_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET); //20, -50);
+
+               //btn ring off
+               btn = lv_imgbtn_create(content, NULL);
+               lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN);
+               lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN);
+               lv_obj_set_event_cb(btn, mmi_vc_ring_off_action);
+               lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_VC_CALLING_RING_OFF_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET); //-20, -50);
+    } 
+       else
+       {
+        lv_obj_t * canvas;
+
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: format=%d\n", __FUNCTION__, __LINE__, ext->voiph263fmt);
+
+        ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_REMOTE;
+        if((ext->voiph263fmt == VOIP_H263_FMT_SQCIF) || (ext->voiph263fmt == VOIP_H263_FMT_QCIF)) 
+               {
+            ext->connect_start_time = time_to_seconds(&rtc_curr);
+
+            /*Create the canvas object*/
+            canvas = lv_canvas_create(content, NULL);
+            lv_obj_set_click(canvas, true);
+            lv_obj_set_event_cb(canvas, canvas_button_hidden_event_cb);
+            video_call_add_element(canvas);
+            ext->canvas = canvas;
+
+            lv_obj_align(canvas, content, LV_ALIGN_IN_TOP_MID, 0, 0);
+            /*Assign the buffer to the canvas*/
+            lv_img_set_src(canvas, ICON_BACKGROUND);
+            voip_signal_check_start(ext);
+
+            // duration
+            label = lv_label_create(canvas, NULL);
+            lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20);
+            lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+            lv_label_set_text(label, "0:0");
+            lv_obj_set_click(label, false);
+            lv_obj_set_base_dir(label, LV_BIDI_DIR_LTR);
+                       lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 0);
+            ext->phone_status_label = label;
+
+            // signal weak notification
+            label = lv_label_create(canvas, NULL);
+            lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+            lv_label_set_text_id(label, WATCH_TEXT_ID_SIGNAL_WEAK);
+            lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+            lv_obj_align(label, canvas, LV_ALIGN_CENTER, 0, -10);
+            lv_obj_set_click(label, false);
+            lv_obj_set_hidden(label, true);
+            ext->signal_weak_label = label;
+
+            // btn volume
+            btn = lv_imgbtn_create(canvas, NULL);
+            lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VOLUME_BTN);
+            lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VOLUME_BTN);
+            lv_obj_set_event_cb(btn, voip_volume_btn_action);
+            lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_LEFT, MMI_VC_CALLING_VOLUME_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+
+            // btn switch video
+            //btn = lv_imgbtn_create(canvas, NULL);
+            //lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_SETTING_VOLTE);
+            //lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_SETTING_VOLTE);
+            //lv_obj_set_event_cb(btn, voip_local_remote_switch_action);
+            //lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
+
+            // btn ring off
+            btn = lv_imgbtn_create(canvas, NULL);
+            lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN);
+            lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN);
+            lv_obj_set_event_cb(btn, mmi_vc_ring_off_action);
+            lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_VC_CALLING_RING_OFF_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET);           
+        } 
+               else if((ext->voiph263fmt == VOIP_H263_FMT_CIF)
+                  || (ext->voiph263fmt == VOIP_H263_FMT_4CIF)
+                  || (ext->voiph263fmt == VOIP_H263_FMT_16CIF)
+                  || (ext->voiph263fmt == VOIP_H263_FMT_OTHER)) 
+               {
+            /*Create the canvas object*/
+            canvas = lv_canvas_create(content, NULL);
+            lv_obj_set_click(canvas, true);
+            lv_obj_set_event_cb(canvas, canvas_button_hidden_event_cb);
+            video_call_add_element(canvas);
+            ext->canvas = canvas;
+
+            /*Assign the buffer to the canvas*/
+            lv_img_set_src(canvas, ICON_BACKGROUND);
+            voip_signal_check_start(ext);
+
+            // duration
+            label = lv_label_create(canvas, NULL);
+            lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20);
+            lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+            lv_label_set_text(label, "0:0");
+            lv_obj_set_click(label, false);
+            lv_obj_set_base_dir(label, LV_BIDI_DIR_LTR);
+                       lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 0);
+            ext->phone_status_label = label;
+            ext->connect_time       = label;
+
+            // signal weak notification
+            label = lv_label_create(canvas, NULL);
+            lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+            lv_label_set_text_id(label, WATCH_TEXT_ID_SIGNAL_WEAK);
+            lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+            lv_obj_align(label, canvas, LV_ALIGN_CENTER, 0, -10);
+            lv_obj_set_click(label, false);
+            lv_obj_set_hidden(label, true);
+            ext->signal_weak_label = label;
+
+            // btn volume
+            btn = lv_imgbtn_create(canvas, NULL);
+            lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VOLUME_BTN);
+            lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VOLUME_BTN);
+            lv_obj_set_event_cb(btn, voip_volume_btn_action);
+            lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_LEFT, MMI_VC_CALLING_VOLUME_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+            lv_obj_add_style(btn, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
+            ext->ring_value_button = btn;
+
+            // btn switch video
+            //btn = lv_imgbtn_create(canvas, NULL);
+            //lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_SETTING_VOLTE);
+            //lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_SETTING_VOLTE);
+            //lv_obj_set_event_cb(btn, voip_local_remote_switch_action);
+            //lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_MID, 0, -20);
+            //lv_obj_add_style(btn, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
+            //ext->view_switch_button = btn;   
+
+            // btn ring off
+            btn = lv_imgbtn_create(canvas, NULL);
+            lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN);
+            lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN);
+            lv_obj_set_event_cb(btn, mmi_vc_ring_off_action);
+            lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_VC_CALLING_RING_OFF_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+            lv_obj_add_style(btn, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
+            ext->ring_off_button = btn;
+
+            lv_obj_set_hidden(ext->connect_time, ext->canvas_button_hidden_flag);
+            lv_obj_set_hidden(ext->ring_value_button, ext->canvas_button_hidden_flag);
+            lv_obj_set_hidden(ext->view_switch_button, ext->canvas_button_hidden_flag);
+            lv_obj_set_hidden(ext->ring_off_button, ext->canvas_button_hidden_flag);
         }
 
-        lv_obj_set_hidden(ext->connect_time, ext->canvas_button_hidden_flag);
-        lv_obj_set_hidden(ext->ring_value_button, ext->canvas_button_hidden_flag);
-        lv_obj_set_hidden(ext->view_switch_button, ext->canvas_button_hidden_flag);
-        lv_obj_set_hidden(ext->ring_off_button, ext->canvas_button_hidden_flag);
+        if(voip_phone_get_obj()) {
+            lv_watch_obj_set_down_slide_cb(voip_phone_get_obj(), voip_phone_down_slide_callback);
+        }
     }
 }
 
-static void voip_set_volume_when_slider_act(void)
+static lv_obj_t * mmi_vc_ui_create(lv_obj_t * activity_obj, MMI_VIDEO_CALL_UI_E video_call_ui)
 {
-    printf("%s\n", __FUNCTION__);
-    if(lv_watch_get_activity_obj(ACT_ID_SLIDER)) {
-        if(MMI_VOIP_CALL_STATE_NULL != s_video_call_params.state) {
-            uint8_t volume = voip_get_call_volume();
-            printf("set nv, speaker volume is %d.\n", volume);
-            UI_NV_Write_Req(NV_SECTION_UI_PHONE, 0, 1, &volume);
-        }
+    printf("%s %d\n", __FUNCTION__, __LINE__);
+
+    if(MMI_VC_UI_CONNECTED == video_call_ui) 
+       {
+        /* set speaker volume to nv when leaving activiry's slider */
+        voip_set_volume_when_slider_act();
     }
-}
 
-#if VIDEO_SIGNAL_CHECK
-static void signal_check(lv_task_t *task)
-{
-    lv_voip_phone_obj_ext_t * ext = voip_phone_get_ext();
-    if(!ext) return;
+    /* cleanup phone first */
+    voip_phone_cleanup();
 
-    if((false == is_rat_gsm()) &&
-       (watch_modem_get_signal_bar_req() < MMI_MODEM_SIGNAL_BAR_3)) {
-        lv_obj_set_hidden(ext->signal_weak_label, false);
-    } else {
-        lv_obj_set_hidden(ext->signal_weak_label, true);
+    if(activity_obj == NULL) 
+       {
+        lv_watch_activity_ext_t activity_ext = {0};
+
+        activity_ext.actId           = ACT_ID_VOIPPHONE;
+        activity_ext.create          = NULL;
+        activity_ext.prepare_destory = voip_phone_prepare_destory;
+        activity_obj                 = lv_watch_creat_activity_obj(&activity_ext);
+        LV_ASSERT_MEM(activity_obj);
+        if(activity_obj == NULL) {
+            return(NULL);
+        }
     }
-}
-#endif
 
-static void voip_signal_check_start(void * ext)
-{
-#if VIDEO_SIGNAL_CHECK
-    if(NULL == signal_check_task)
-        signal_check_task = lv_task_create(signal_check, VIDEO_SIGNAL_CHECK_PERIOD, LV_TASK_PRIO_HIGH, NULL);
-#endif
-}
+    lv_obj_t * obj = lv_watch_obj_create(activity_obj);
+    LV_ASSERT_MEM(obj);
+    if(obj == NULL) {
+        return(NULL);
+    }
+    lv_watch_obj_set_anim_mode(obj, LV_WATCH_LEFT_OR_RIGHT_SLIDE_CALLBACK);
+    lv_watch_obj_set_left_slide_cb(obj, voip_phone_left_slide_callback);
+    lv_watch_obj_set_right_slide_cb(obj, voip_phone_right_slide_callback);
 
-static void voip_signal_check_stop(void)
-{
-#if VIDEO_SIGNAL_CHECK
-    if(signal_check_task) {
-        lv_task_del(signal_check_task);
-        signal_check_task = NULL;
+    lv_voip_phone_obj_ext_t * ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_voip_phone_obj_ext_t));
+    LV_ASSERT_MEM(ext);
+    if(ext == NULL) {
+        return(NULL);
     }
+
+    ext->phone_status_label       = NULL;
+    ext->phone_animation_obj      = NULL;
+    ext->phone_ui_t               = video_call_ui;
+    ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_NULL;
+#if ENABLE_VIDEO_SCALE == 0
+    ext->voiph263fmt = VOIP_H263_FMT_QCIF;
+#else
+    ext->voiph263fmt = VOIP_H263_FMT_OTHER;
 #endif
-}
 
-static bool is_rat_gsm(void)
-{
-    MMI_MODEM_PLMN_RAT rat;
+    hal_rtc_t rtc_curr;            // current rtc time
+    Hal_Rtc_Gettime(&rtc_curr);
+    ext->connect_start_time = time_to_seconds(&rtc_curr);
+    ext->connect_time = NULL;
+    ext->ring_value_button = NULL;
+    ext->view_switch_button = NULL;
+    ext->ring_off_button = NULL;
+    ext->canvas_button_hidden_flag = NOT_HIDDEN;
 
-    watch_modem_get_operator_req(&rat);
-    if(MMI_MODEM_PLMN_RAT_GSM == rat)
-        return true;
-    else
-        return false;
-}
+    /* content */
+    lv_obj_t * content = lv_cont_create(obj, NULL);
+    lv_obj_set_size(content, lv_obj_get_width(obj), lv_obj_get_height(obj)); // lv_obj_get_height(obj) - 20);
+    //lv_cont_set_layout(content, LV_LAYOUT_COLUMN_MID);
+    LV_ASSERT_MEM(content);
+    if(content == NULL) {
+        return(NULL);
+    }
+    lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
+    /* must click false */
+    lv_obj_set_click(content, false);
+    lv_obj_align(content, obj, LV_ALIGN_CENTER, 0, 0);
 
-static void rat_check(lv_task_t *task)
-{
-    if(is_rat_gsm()) {
-        mmi_video_call_phone_ring_off_action(NULL, LV_EVENT_CLICKED);
+    if(ext->phone_ui_t == MMI_VC_UI_DIALING)
+       {
+        mmi_vc_ui_dialing(content);
+        voip_dialing_animation(ext->phone_status_label);
+    } 
+       else if(ext->phone_ui_t == MMI_VC_UI_INCOMING) 
+       {
+        mmi_vc_ui_incoming(content);
+        voip_ring_animation(ext->phone_status_label);
+    } 
+       else if(ext->phone_ui_t == PHONE_UI_CONNECTED) 
+       {
+        mmi_vc_ui_connected(content);
+        voip_connected_animation(ext->phone_status_label);
     }
-}
 
-static void voip_rat_check_start(void)
-{
-    if(NULL == rat_check_task)
-        rat_check_task = lv_task_create(rat_check, VIDEO_RAT_CHECK_PERIOD, LV_TASK_PRIO_HIGH, NULL);
+    return obj;
 }
 
-static void voip_rat_check_stop(void)
+void mmi_vc_call_action_incoming(char * number, MODEM_VIDEO_CALL_TYPE type)
 {
-    if(rat_check_task) {
-        lv_task_del(rat_check_task);
-        rat_check_task = NULL;
-    }
-}
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__, number, type);
 
-void voip_fps_check(int8_t fps)
-{
-    lv_voip_phone_obj_ext_t * ext = voip_phone_get_ext();
-    if(NULL != ext) {
-        if((VIDEO_CALL_FPS_CHECK_LIMIT >= fps) && (0 != fps)) {
-            printf("%s %d\n", __FUNCTION__, fps);
-            if(lv_obj_get_hidden(ext->signal_weak_label) == false) return;
-            lv_obj_set_hidden(ext->signal_weak_label, false);
-        } else {
-            if(lv_obj_get_hidden(ext->signal_weak_label) == true) return;
-            lv_obj_set_hidden(ext->signal_weak_label, true);
-        }
+       if(true == mmi_active_screen_is_prohibit_interrupted() || true == is_rat_gsm())
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__);
+               
+        mmi_video_call_reject_req(TRUE);
+        return;
     }
-}
-
 
+    if(AUDIO_CTRL_PRIORITY_2 == Hal_Audio_Manage_Start_Req(AUDIO_CTRL_PRIORITY_2, voip_audio_ctrl_callback))
+    {
+               Hal_Mem_Set(&s_video_call_params, 0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+               s_video_call_params.call_type = type;
+               s_video_call_params.is_mt = true;
+               s_video_call_params.state = MMI_VIDEO_CALL_STATE_INCOMING;
+               strncpy(s_video_call_params.number, number, NV_WATCH_VC_CONTACT_NUMBER_LEN - 1);
+               
+        watch_set_lcd_status(true);
 
-#ifdef __VIDEO_CALL_TEST__
-#define MMI_VC_ROOM_ID "jrtc001" // "104799"
-#endif
+               HAL_SPEAKER_GAIN volume = query_current_volume();
+               
+               if(!Hal_Set_BT_Audio_Path(volume))
+               {
+                       Hal_Call_Speaker(HAL_CALL_SPK_ON, volume);
+               }
+        Hal_NFFS_File_Play_Repeat(AUDIO_INCOMING_CALL, volume);
 
-static nv_watch_vc_contact_t s_vc_contact = {0};
-static TIMER_ID fail_timer_id = NULL;
+        voip_rat_check_start();
+        mmi_vc_ui_create(NULL, MMI_VC_UI_INCOMING);
+    }
+    else
+    { 
+               // AUDIO_CTRL_PRIORITY_1
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__);
+               
+        // auto reject
+        mmi_video_call_reject_req(FALSE);
+        voip_signal_check_stop();
+        voip_rat_check_stop();
 
-char * mmi_video_call_params_number_get(void)
-{
-       return (s_video_call_params.number);
-}
+        // stop ring off timer
+        if(NULL != s_video_call_params.ring_off_timer_id) 
+               {
+            Hal_Timer_Stop(s_video_call_params.ring_off_timer_id);
+            s_video_call_params.ring_off_timer_id = NULL;
+        }
 
-MMI_VOIP_CALL_STATE_E mmi_video_call_params_state_get(void)
-{
-       return (s_video_call_params.state);
-}
+        // stop callreq timer
+        if(NULL != s_video_call_params.callreq_timer_id) 
+               {
+            Hal_Timer_Stop(s_video_call_params.callreq_timer_id);
+            s_video_call_params.callreq_timer_id = NULL;
+        }
 
-MODEM_VIDEO_CALL_TYPE mmi_video_call_params_type_get(void)
-{
-       return (s_video_call_params.voip_call_type);
+        Hal_Mem_Set(&s_video_call_params, 0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+        voip_set_volume_when_slider_act();
+        voip_phone_cleanup();
+        lv_watch_png_cache_all_free();
+        Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
+    }
 }
 
 
-
-void mmi_video_call_contact_nv_write(void)
-{
-       uint32_t nv_data_length = sizeof(nv_watch_vc_contact_t);
-       
-       if(nv_data_length != UI_NV_Write_Req(NV_SECTION_UI_VC_CONTACT, 0, nv_data_length, (uint8_t *)&s_vc_contact))
-       {
-               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: nv write fail\n", __FUNCTION__, __LINE__);
-       }
-}
-
-void mmi_video_call_contact_nv_read(void)
+void mmi_vc_call_action_connect(void)
 {
-       uint32_t nv_data_length = sizeof(nv_watch_vc_contact_t);
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: \n", __FUNCTION__, __LINE__);
        
-       if(nv_data_length != UI_NV_Read_Req(NV_SECTION_UI_VC_CONTACT, 0, nv_data_length, (uint8_t *)&s_vc_contact))
-       {
-               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: nv read fail\n", __FUNCTION__, __LINE__);
-       }
-}
-
-void mmi_video_call_contact_set(nv_watch_vc_contact_t * contact_list)
-{
-    if(NULL == contact_list) 
+    if(MMI_VIDEO_CALL_STATE_CALLING == s_video_call_params.state)
        {
-               VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: \n", __FUNCTION__, __LINE__);
         return;
     }
+    s_video_call_params.state = MMI_VIDEO_CALL_STATE_CALLING;
 
-       _lv_memcpy(&s_vc_contact, contact_list, sizeof(nv_watch_vc_contact_t));
-       mmi_video_call_contact_nv_write();
+    // stop callreq timer
+    if(NULL != s_video_call_params.callreq_timer_id) 
+       {
+        Hal_Timer_Stop(s_video_call_params.callreq_timer_id);
+        s_video_call_params.callreq_timer_id = NULL;
+    }
 
+    // stop playing tone
+    Hal_Tone_Play_End();
 
-    //phonebook_update_ui(contact_list, count, 0, 0);
+    Hal_Set_Voice_Call_Status(VOICE_CALL_START);
 
+    // create connected UI
+    mmi_vc_ui_create(NULL, MMI_VC_UI_CONNECTED);
 }
 
-
-
-
-static void mmi_video_call_req_timeout_cb(void * para)
+static void mmi_vc_call_dialing_timeout_cb(void * para)
 {
        VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: \n", __FUNCTION__, __LINE__);
 
@@ -1770,12 +1615,12 @@ static void mmi_video_call_req_timeout_cb(void * para)
     mmi_video_call_hangup_req(TRUE);
 }
 
-void mmi_video_call_req(char * number, MODEM_VIDEO_CALL_TYPE voip_call_type)
+void mmi_vc_call_action_dialing(char * number, MODEM_VIDEO_CALL_TYPE type)
 {
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__, number, voip_call_type);
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__, number, type);
 
     // check call state
-    if(MMI_VOIP_CALL_STATE_NULL != s_video_call_params.state)
+    if(MMI_VIDEO_CALL_STATE_NONE != s_video_call_params.state)
        {
                VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: %d\n", __FUNCTION__, __LINE__, s_video_call_params.state);
         return;
@@ -1797,26 +1642,26 @@ void mmi_video_call_req(char * number, MODEM_VIDEO_CALL_TYPE voip_call_type)
 
     // set call parameters
     Hal_Mem_Set(&s_video_call_params, 0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
-    s_video_call_params.is_mt          = false;
-    s_video_call_params.state          = MMI_VOIP_CALL_STATE_DIALING;
-    s_video_call_params.voip_call_type = voip_call_type;
+    s_video_call_params.is_mt = false;
+    s_video_call_params.state = MMI_VIDEO_CALL_STATE_DIALING;
+    s_video_call_params.call_type = type;
     strcpy(s_video_call_params.number, number);
-
-    int8_t ret = mmi_video_call_dial_req(voip_call_type, s_video_call_params.number);
+       
+    int8_t ret = mmi_video_call_dial_req(type, s_video_call_params.number);
     if(NULL == s_video_call_params.callreq_timer_id) 
        {
                UINT32 timeout = (ret >= 0) ? VOIP_CALLREQ_TIME_OUT : 1*1000;
                
-        s_video_call_params.callreq_timer_id = Hal_Timer_Start(timeout, mmi_video_call_req_timeout_cb, NULL, 0);
+        s_video_call_params.callreq_timer_id = Hal_Timer_Start(timeout, mmi_vc_call_dialing_timeout_cb, NULL, 0);
     }
     // create dialing UI
     voip_rat_check_start();
-    mmi_video_call_phone_create(NULL, VOIP_PHONE_UI_DIALING);
+    mmi_vc_ui_create(NULL, MMI_VC_UI_DIALING);
     Hal_Audio_Manage_Start_Req(AUDIO_CTRL_PRIORITY_2, voip_audio_ctrl_callback);
     Hal_Set_Voice_Call_Status(VOICE_CALL_START);
 }
 
-static void mmi_video_call_main_prepare_destory(lv_obj_t * activity_obj)
+static void mmi_vc_main_prepare_destory(lv_obj_t * activity_obj)
 {
        VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: \n", __FUNCTION__, __LINE__);
        
@@ -1831,7 +1676,7 @@ static void mmi_video_call_main_prepare_destory(lv_obj_t * activity_obj)
 
 void mmi_video_call_fail_timeout_cb(void *para)
 {
-       mmi_video_call_main_prepare_destory(NULL);
+       mmi_vc_main_prepare_destory(NULL);
 }
 
 static void mmi_video_call_fail(lv_obj_t * obj)
@@ -1855,19 +1700,19 @@ static void mmi_video_call_fail(lv_obj_t * obj)
        TIMER_ID timer_id = Hal_Timer_Start(2*1000, mmi_video_call_fail_timeout_cb, NULL, FALSE);
 }
 
-static void mmi_video_call_voice_btn_action(lv_obj_t * btn, lv_event_t e)
+static void mmi_vc_voice_btn_action(lv_obj_t * btn, lv_event_t e)
 {
     if(LV_EVENT_CLICKED != e)
        {
         return;
     }
 
-    if(mmi_video_call_check_mo_permission())
+    if(true == mmi_video_call_check_mo_permission())
        {
        #ifdef __VIDEO_CALL_TEST__
-        mmi_video_call_req(MMI_VC_ROOM_ID, MODEM_VIDEO_CALL_TYPE_VOICE);
+        mmi_vc_call_action_dialing(MMI_VC_ROOM_ID, MODEM_VIDEO_CALL_TYPE_VOICE);
        #else
-               mmi_video_call_req(, MODEM_VIDEO_CALL_TYPE_VOICE);
+               mmi_vc_call_action_dialing(s_vc_contact.number[0], MODEM_VIDEO_CALL_TYPE_VOICE);
        #endif
     } 
        else 
@@ -1876,19 +1721,19 @@ static void mmi_video_call_voice_btn_action(lv_obj_t * btn, lv_event_t e)
     }
 }
 
-static void mmi_video_call_video_btn_action(lv_obj_t * btn, lv_event_t e)
+static void mmi_vc_video_btn_action(lv_obj_t * btn, lv_event_t e)
 {
     if(LV_EVENT_CLICKED != e)
        {
         return;
     }
 
-    if(mmi_video_call_check_mo_permission()) 
+    if(true == mmi_video_call_check_mo_permission()) 
        {
        #ifdef __VIDEO_CALL_TEST__
-        mmi_video_call_req(MMI_VC_ROOM_ID, MODEM_VIDEO_CALL_TYPE_VIDEO);
+        mmi_vc_call_action_dialing(MMI_VC_ROOM_ID, MODEM_VIDEO_CALL_TYPE_VIDEO);
        #else
-               mmi_video_call_req(, MODEM_VIDEO_CALL_TYPE_VIDEO);
+               mmi_vc_call_action_dialing(s_vc_contact.number[0], MODEM_VIDEO_CALL_TYPE_VIDEO);
        #endif
     } 
        else 
@@ -1897,15 +1742,15 @@ static void mmi_video_call_video_btn_action(lv_obj_t * btn, lv_event_t e)
     }
 }
 
-static lv_obj_t * mmi_video_call_main_create(lv_obj_t * activity_obj)
+static lv_obj_t * mmi_vc_main_create(lv_obj_t * activity_obj)
 {
     if(activity_obj == NULL) 
        {
         lv_watch_activity_ext_t activity_ext = {0};
 
         activity_ext.actId = ACT_ID_VOIP_PHONEBOOK;
-        activity_ext.create = mmi_video_call_main_create;
-        activity_ext.prepare_destory = mmi_video_call_main_prepare_destory;
+        activity_ext.create = mmi_vc_main_create;
+        activity_ext.prepare_destory = mmi_vc_main_prepare_destory;
         activity_obj = lv_watch_creat_activity_obj(&activity_ext);
         if(NULL == activity_obj)
             return NULL;
@@ -1933,6 +1778,20 @@ static lv_obj_t * mmi_video_call_main_create(lv_obj_t * activity_obj)
        {
                VIDEO_CALL_DEBUG_PRINTF("[@CHENG][%s][%d]: \n", __FUNCTION__, __LINE__);
                
+
+       #if 0
+               lv_obj_t * obj = lv_watch_list_create(NULL);
+               if(obj == NULL) 
+                       return NULL;
+       
+               lv_watch_list_set_name_txt(obj, WATCH_TEXT_ID_SETTINGS);
+       
+               for(int8_t i = 0; i < (sizeof(settingList) / sizeof(settingList[0])); i++) 
+               {
+                       lv_watch_list_add(obj, (void *)settingList[i].img_src, settingList[i].txtId, settingList[i].event_cb);
+               }
+
+       #else
                lv_obj_t * cont = lv_cont_create(obj, NULL);
                lv_cont_set_fit(cont, LV_FIT_NONE);
                lv_obj_set_size(cont, lv_obj_get_width(obj), lv_obj_get_height(obj));
@@ -1944,15 +1803,16 @@ static lv_obj_t * mmi_video_call_main_create(lv_obj_t * activity_obj)
                lv_imgbtn_set_src(voicebtn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VOICE_BTN);
                lv_imgbtn_set_src(voicebtn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VOICE_BTN);
                lv_obj_align(voicebtn, cont, LV_ALIGN_IN_TOP_MID, 0, 10);
-               lv_obj_set_event_cb(voicebtn, mmi_video_call_voice_btn_action);
+               lv_obj_set_event_cb(voicebtn, mmi_vc_voice_btn_action);
                
                lv_obj_t * videobtn = lv_imgbtn_create(cont, NULL);
                lv_imgbtn_set_src(videobtn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VIDEO_BTN);
                lv_imgbtn_set_src(videobtn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VIDEO_BTN);
                lv_obj_align(videobtn, cont, LV_ALIGN_IN_BOTTOM_MID, 0, -10);
-               lv_obj_set_event_cb(videobtn, mmi_video_call_video_btn_action);
+               lv_obj_set_event_cb(videobtn, mmi_vc_video_btn_action);
 
                //lv_watch_set_free_num(activity_obj, 1);
+       #endif
     }
 
     return(obj);
@@ -1963,7 +1823,7 @@ void video_call_create_event_cb(lv_obj_t * btn, lv_event_t e)
     if(LV_EVENT_CLICKED == e) 
        {               
         lv_watch_png_cache_all_free();
-        mmi_video_call_main_create(NULL);
+        mmi_vc_main_create(NULL);
     }
     else if(LV_EVENT_LONG_PRESSED == e)
        {
@@ -1986,9 +1846,9 @@ uint8_t voip_get_call_volume(void)
 bool watch_voip_suspend_check(void)
 {
 #ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__
-    if((s_video_call_params.voip_call_type == MODEM_VIDEO_CALL_TYPE_VIDEO)
-               || (MMI_VOIP_CALL_STATE_INCOMING == s_video_call_params.state)
-               || (MMI_VOIP_CALL_STATE_DIALING == s_video_call_params.state)
+    if((s_video_call_params.call_type == MODEM_VIDEO_CALL_TYPE_VIDEO)
+               || (MMI_VIDEO_CALL_STATE_INCOMING == s_video_call_params.state)
+               || (MMI_VIDEO_CALL_STATE_DIALING == s_video_call_params.state)
                ) 
     {
         return false;
@@ -2023,16 +1883,16 @@ void voip_activity_destroy_req(void)
 
     switch(s_video_call_params.state) 
        {
-        case MMI_VOIP_CALL_STATE_NULL:
-        case MMI_VOIP_CALL_STATE_INVALID:
+        case MMI_VIDEO_CALL_STATE_NONE:
+        case MMI_VIDEO_CALL_STATE_INVALID:
             // do noting
             break;
 
-        case MMI_VOIP_CALL_STATE_ACTIVE:
+        case MMI_VIDEO_CALL_STATE_CALLING:
             mmi_video_call_hangup_req(FALSE);
             break;
 
-        case MMI_VOIP_CALL_STATE_INCOMING:
+        case MMI_VIDEO_CALL_STATE_INCOMING:
             Hal_Tone_Play_End();
             mmi_video_call_reject_req(FALSE);
             break;
@@ -2058,7 +1918,7 @@ void voip_activity_destroy_req(void)
     }
 
     Hal_Mem_Set(&s_video_call_params, 0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
-    s_video_call_params.state = MMI_VOIP_CALL_STATE_NULL;
+    s_video_call_params.state = MMI_VIDEO_CALL_STATE_NONE;
     voip_set_volume_when_slider_act();
     voip_phone_cleanup();
     lv_watch_png_cache_all_free();
index 0ec167f..cf5c423 100644 (file)
@@ -39,19 +39,15 @@ uint8_t voip_get_call_volume(void);
 #define VIDEO_CALL_DEBUG_PRINTF(fmt, ...)
 #endif
 
-#define __VIDEO_CALL_TEST__
+//#define __VIDEO_CALL_TEST__
+
 
 
 #define ENABLE_VIDEO_SCALE  1
-#define VOIP_PHONE_TEST  0
-#define VOIP_PHONEBOOK_TEST 0
-#define VOIP_JUPHOON_TEST 0 // 1
+
 #define VOIP_PHONE_RING_OFF_ANIMATION_TIME 0
 #define VOIP_PHONE_RING_OFF_CONTINUE_TIME 1500   /*ms*/
-#define VOIP_PHONE_NV_VOLUME_OFFSET          0
-#define VOIP_PHONE_NV_EMERGENCY_NUM_OFFSET   1
-#define VOIP_PHONEBOOK_CONTACTS_MAX_NAME_LEN    NV_CONTACTS_MAX_NAME_LEN
-#define VOIP_PHONEBOOK_CONTACTS_MAX_NUMBER_LEN  NV_CONTACTS_MAX_NUMBER_LEN
+
 #define LV_COLOR_HEX3(c) LV_COLOR_MAKE((uint8_t) (((c >> 4) & 0xF0) | ((c >> 8) & 0xF)),   \
                                 (uint8_t) ((uint32_t)(c & 0xF0)     | ((c & 0xF0) >> 4)), \
                                 (uint8_t) ((uint32_t)(c & 0xF)      | ((c & 0xF) << 4)))
@@ -77,28 +73,31 @@ uint8_t voip_get_call_volume(void);
 
 #define VOIP_CALLREQ_TIME_OUT    60*1000
 
+#if USE_LV_WATCH_UI_240_320
+#define MMI_VC_RING_OFF_BTN_Y_OFFSET (-30)
+#define MMI_VC_INCOMING_RING_OFF_BTN_X_OFFSET (20)
+#define MMI_VC_INCOMING_HOOK_BTN_X_OFFSET (-20)
+
+#define MMI_VC_CALLING_RING_OFF_BTN_X_OFFSET (-20)
+#define MMI_VC_CALLING_VOLUME_BTN_X_OFFSET (20)
+
+#elif USE_LV_WATCH_UI_240_280
+#define MMI_VC_RING_OFF_BTN_Y_OFFSET (-15)
+#define MMI_VC_INCOMING_RING_OFF_BTN_X_OFFSET (20)
+#define MMI_VC_INCOMING_HOOK_BTN_X_OFFSET (-20)
+
+#define MMI_VC_CALLING_RING_OFF_BTN_X_OFFSET (-20)
+#define MMI_VC_CALLING_VOLUME_BTN_X_OFFSET (20)
+
+#else
+
+
+#endif
+
 /**********************
  *      TYPEDEFS
  **********************/
 
-typedef enum {
-    VOIP_PHONE_UI_INCOMING = 0,
-    VOIP_PHONE_UI_DIALING,
-    VOIP_PHONE_UI_CONNECTED,
-} voip_phone_ui_e;
-
-typedef enum
-{
-    MMI_VOIP_CALL_STATE_NULL     = 0,
-    MMI_VOIP_CALL_STATE_ACTIVE   = 1,
-    MMI_VOIP_CALL_STATE_HOLDING  = 2,
-    MMI_VOIP_CALL_STATE_DIALING  = 3,                                           /* MO call only */
-    MMI_VOIP_CALL_STATE_ALERTING = 4,                                           /* MO call only */
-    MMI_VOIP_CALL_STATE_INCOMING = 5,                                           /* MT call only */
-    MMI_VOIP_CALL_STATE_WAITING  = 6,                                           /* MT call only */
-    MMI_VOIP_CALL_STATE_INVALID  = 0xFF
-} MMI_VOIP_CALL_STATE_E;
-
 enum voipregisterstate
 {
     VOIP_REGISTER_OK = 0,
@@ -128,6 +127,9 @@ enum enum_canvas_button_hidden_flag
     HIDDEN
 };
 
+#define VOIP_PHONEBOOK_CONTACTS_MAX_NAME_LEN    NV_CONTACTS_MAX_NAME_LEN
+#define VOIP_PHONEBOOK_CONTACTS_MAX_NUMBER_LEN  NV_CONTACTS_MAX_NUMBER_LEN
+
 typedef struct {
     char contact_name[VOIP_PHONEBOOK_CONTACTS_MAX_NAME_LEN];
     char contact_number[VOIP_PHONEBOOK_CONTACTS_MAX_NUMBER_LEN];
@@ -151,21 +153,37 @@ typedef struct {
     lv_coord_t move_width;
 } lv_voip_phonebook_obj_ext_t;
 
+typedef enum 
+{
+    MMI_VC_UI_INCOMING = 0,
+    MMI_VC_UI_DIALING,
+    MMI_VC_UI_CONNECTED,
+} MMI_VIDEO_CALL_UI_E;
+
+typedef enum
+{
+       MMI_VIDEO_CALL_STATE_NONE,
+       MMI_VIDEO_CALL_STATE_CALLING,
+       MMI_VIDEO_CALL_STATE_INCOMING,
+       MMI_VIDEO_CALL_STATE_DIALING,
+       MMI_VIDEO_CALL_STATE_INVALID,
+}MMI_VIDEO_CALL_STATE_E;
+
+
 #define VOIP_RING_OFF_TIMER_LEN    1000
 
 typedef struct {
-    MMI_VOIP_CALL_STATE_E state;
-    int32_t              index;                    /* Connection Index for use with, eg, AT+CHLD */
+    MMI_VIDEO_CALL_STATE_E state;
+    //int32_t              index;                    /* Connection Index for use with, eg, AT+CHLD */
     bool                 is_mt;                    /* true if MT call */
     bool                 ring_off;                 /* true if ring off by user */
     bool                 ring_off_timeout;         /* true if ring off timeout */
-    bool                 buffer_alarm;
     TIMER_ID             ring_off_timer_id;        /* ring off timer */
-    char                 number[NV_CONTACTS_MAX_NUMBER_LEN];   /* phone number */
-    char                 name[NV_CONTACTS_MAX_NAME_LEN];       /* contact name */
+    char                 number[NV_WATCH_VC_CONTACT_NUMBER_LEN];   /* phone number */
+    char                 name[NV_WATCH_VC_CONTACT_NAME_LEN];       /* contact name */
     //const void * img_src;
     //const void * img_src_small;
-    MODEM_VIDEO_CALL_TYPE    voip_call_type;
+    MODEM_VIDEO_CALL_TYPE call_type;
     TIMER_ID             callreq_timer_id;         /* callreq timer */
     uint8_t              speaker_volume;           /* speaker volume during call procedure */
 } MMI_VIDEO_CALL_PARAMS_T;
@@ -176,7 +194,7 @@ typedef struct {
     lv_obj_t * phone_status_label;
     lv_obj_t * phone_animation_obj;
     uint32_t connect_start_time;
-    voip_phone_ui_e phone_ui_t;
+    MMI_VIDEO_CALL_UI_E phone_ui_t;
     enum local_remote_switch_e local_remote_switch_flag;
     enum voip_h263_fmt voiph263fmt;
     lv_obj_t * connect_time;
@@ -192,22 +210,23 @@ typedef struct {
  * GLOBAL PROTOTYPES
  **********************/
 lv_voip_phone_obj_ext_t * voip_phone_get_ext(void);
-void * mmi_video_call_phone_get_video_buffer(void);
-void watch_voip_call_response_connect(int32_t index);
-void watch_voip_call_response_no_carrier(int32_t index, uint8_t isNoCarrier);
-void watch_voip_call_response_alerting(int32_t index);
-void watch_voip_incomingcall_response(char * number, int32_t calltype);
-void watch_voip_call_response_bottom_error(void);
-void watch_voip_call_response_bottom_need_redail(void);
+
 bool check_voipcall_enter_pm_ind(void);
 void watch_voip_message_handle_init(void);
-void watch_ui_voip_message_handle(void * voipmsg);
-void watch_voip_autotest_handle(void * testmsg);
+
 
 void mmi_video_call_jrtc_config_init_00(void);
 void mmi_video_call_jrtc_config_init_01(char * t_appkey, char * t_key, char * t_tokens);
 void mmi_video_call_contact_nv_read(void);
-void mmi_video_call_contact_set(nv_watch_vc_contact_t * contact_list);
+void mmi_vc_contact_set(nv_watch_vc_contact_t * contact_list);
+
+void * mmi_video_call_phone_get_video_buffer(void);
+void mmi_vc_ring_off_no_carrier(uint8_t isNoCarrier);
+
+void mmi_vc_call_action_incoming(char * number, MODEM_VIDEO_CALL_TYPE type);
+void mmi_vc_call_action_connect(void);
+void mmi_vc_call_action_dialing(char * number, MODEM_VIDEO_CALL_TYPE type);
+
 
 int8_t mmi_video_call_dial_req(MODEM_VIDEO_CALL_TYPE calltype, char * pContactUri);
 void mmi_video_call_hangup_req(BOOL bye);
index 311a19c..1b96c9a 100644 (file)
@@ -59,6 +59,24 @@ extern phone_call_params_t  call_params;
  *   GLOBAL FUNCTIONS
 ***********************/
 #ifdef __MMI_ZHSX_SUPPORT__
+
+#if USE_LV_WATCH_UI_240_320
+#define MMI_PHONE_CALL_BTN_Y_OFFSET (-50)
+#define MMI_PHONE_CALL_LEFT_BTN_X_OFFSET (20)
+#define MMI_PHONE_CALL_RIGHT_BTN_X_OFFSET (-20)
+
+#elif USE_LV_WATCH_UI_240_280
+#define MMI_PHONE_CALL_BTN_Y_OFFSET (-50 + 15)
+#define MMI_PHONE_CALL_LEFT_BTN_X_OFFSET (20)
+#define MMI_PHONE_CALL_RIGHT_BTN_X_OFFSET (-20)
+
+#else
+#define MMI_PHONE_CALL_BTN_Y_OFFSET (-50)
+#define MMI_PHONE_CALL_LEFT_BTN_X_OFFSET (20)
+#define MMI_PHONE_CALL_RIGHT_BTN_X_OFFSET (-20)
+
+#endif
+
 static void phone_dialing(lv_obj_t * content)
 {
        printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
@@ -108,14 +126,14 @@ static void phone_dialing(lv_obj_t * content)
        lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_PHONE_RING_VOLUME);
        lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_PHONE_RING_VOLUME);
        lv_obj_set_event_cb(btn, volume_btn_action);
-       lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_LEFT, 20, -50);
+       lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_LEFT, MMI_PHONE_CALL_LEFT_BTN_X_OFFSET, MMI_PHONE_CALL_BTN_Y_OFFSET);
 
        //btn ring off
        btn = lv_imgbtn_create(content, NULL);
        lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_PHONE_RING_OFF);
        lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_PHONE_RING_OFF);
        lv_obj_set_event_cb(btn, ring_off_action);
-       lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_RIGHT, -20, -50);
+       lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_PHONE_CALL_RIGHT_BTN_X_OFFSET, MMI_PHONE_CALL_BTN_Y_OFFSET);
 }
 
 static void phone_ring(lv_obj_t * content)
@@ -170,14 +188,14 @@ static void phone_ring(lv_obj_t * content)
        lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_PHONE_RING_OFF);
        lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_PHONE_RING_OFF);
        lv_obj_set_event_cb(btn, ring_off_action);
-       lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_LEFT, 20, -50);
+       lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_LEFT, MMI_PHONE_CALL_LEFT_BTN_X_OFFSET, MMI_PHONE_CALL_BTN_Y_OFFSET);
 
        //btn ring hook
        btn = lv_imgbtn_create(content, NULL);
        lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_PHONE_HOOK);
        lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_PHONE_HOOK);
        lv_obj_set_event_cb(btn, ring_hook_action);
-       lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_RIGHT, -20, -50);
+       lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_PHONE_CALL_RIGHT_BTN_X_OFFSET, MMI_PHONE_CALL_BTN_Y_OFFSET);
 }
 
 static void phone_connected(lv_obj_t * content)
@@ -231,14 +249,14 @@ static void phone_connected(lv_obj_t * content)
        lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_PHONE_RING_VOLUME);
        lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_PHONE_RING_VOLUME);
        lv_obj_set_event_cb(btn, volume_btn_action);
-       lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_LEFT, 20, -50);
+       lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_LEFT, MMI_PHONE_CALL_LEFT_BTN_X_OFFSET, MMI_PHONE_CALL_BTN_Y_OFFSET);
 
        //btn ring off
        btn = lv_imgbtn_create(content, NULL);
        lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_PHONE_RING_OFF);
        lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_PHONE_RING_OFF);
        lv_obj_set_event_cb(btn, ring_off_action);
-       lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_RIGHT, -20, -50);
+       lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_PHONE_CALL_RIGHT_BTN_X_OFFSET, MMI_PHONE_CALL_BTN_Y_OFFSET);
 
        hal_rtc_t rtc_curr;                // current rtc time
        Hal_Rtc_Gettime(&rtc_curr);
index 18146f0..fbe230b 100644 (file)
@@ -58,6 +58,77 @@ void setting_about_create_btn_action(lv_obj_t * btn, lv_event_t event)
  **********************/
 static lv_obj_t * setting_about_create(lv_obj_t * activity_obj)
 {
+#ifdef __MMI_ZHSX_SUPPORT__
+    char info_str[96 + 1] = {0};
+
+    if(NULL == activity_obj) {
+        lv_watch_activity_ext_t activity_ext;
+        memset(&activity_ext, 0, sizeof(lv_watch_activity_ext_t));
+        activity_ext.actId = ACT_ID_SETTING_ABOUT;
+        activity_ext.create = setting_about_create;
+        activity_ext.prepare_destory = setting_about_prepare_destory;
+        activity_obj = lv_watch_creat_activity_obj(&activity_ext);
+        LV_ASSERT_MEM(activity_obj);
+        if(NULL == activity_obj) {
+            return NULL;
+        }
+    }
+
+    lv_obj_t * obj = lv_watch_obj_create(activity_obj);
+    LV_ASSERT_MEM(obj);
+    if(NULL == obj) {
+        return NULL;
+    }
+
+    lv_obj_t * content = lv_cont_create(obj, NULL);
+    lv_obj_set_size(content, lv_obj_get_width(obj), lv_obj_get_height(obj));
+    lv_obj_add_style(content, LV_CONT_PART_MAIN, &lv_watch_style_transp);
+    lv_obj_align(content, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0);
+    lv_obj_set_click(content, true);
+    lv_setting_about_ext_t * about_ext = lv_obj_allocate_ext_attr(content, sizeof(lv_setting_about_ext_t));
+    about_ext->click_count = 0;
+
+    lv_obj_t * title_label = lv_label_create(content, NULL);
+    lv_obj_add_style(title_label, LV_LABEL_PART_MAIN, &lv_watch_font20_gray);
+    lv_label_set_align(title_label, LV_LABEL_ALIGN_CENTER);
+    lv_obj_set_click(title_label, false);
+    lv_label_set_text_id(title_label, WATCH_TEXT_ID_ABOUT_WATCH);
+    lv_obj_align(title_label, content, LV_ALIGN_IN_TOP_MID, 0, 10);
+
+    lv_obj_t * info_label = lv_label_create(content, NULL);
+    lv_obj_add_style(info_label, LV_LABEL_PART_MAIN, &lv_watch_font26); // &lv_watch_font20);
+    lv_label_set_long_mode(info_label, LV_LABEL_LONG_BREAK);
+       lv_obj_set_width(info_label, LV_HOR_RES - 20);
+    lv_label_set_align(info_label, LV_LABEL_ALIGN_CENTER);
+       snprintf(info_str, 96, "%s:%s\n%s:%s", (char *)lv_lang_get_text(WATCH_TEXT_ID_MODE), app_adaptor_get_model_id(), 
+                                               (char *)lv_lang_get_text(WATCH_TEXT_ID_VERSION_NUM), app_adaptor_get_version());
+       lv_label_set_text(info_label, info_str);
+       lv_obj_align(info_label, content, LV_ALIGN_IN_TOP_MID, 0, 80);
+    lv_obj_set_click(info_label, false);
+
+#if USE_LV_WATCH_ALIPAY != 0
+    lv_obj_t * labelId2 = lv_label_create(content, NULL);
+    lv_obj_add_style(labelId2,LV_OBJ_PART_MAIN, &lv_watch_font26); // &lv_watch_font20);
+    lv_obj_set_click(labelId2, false);
+    lv_obj_align(labelId2, content, LV_ALIGN_OUT_BOTTOM_MID, -10, -40);
+
+    uint8_t id2_st = 0;
+    upay_id2_init();
+    upay_id2_check_status(&id2_st);
+    if( id2_st == 0) {
+        lv_label_set_text(labelId2, "ID2:No");
+    } else {
+        lv_label_set_text(labelId2, "ID2:Yes");
+    }
+#endif
+
+    lv_obj_set_event_cb(content, setting_about_click_event_cb);
+    lv_watch_obj_add_element(content);
+
+    return obj;
+
+#else
+
     char model_str[20] = {};
     char version_str[40] = {};
 
@@ -134,6 +205,7 @@ static lv_obj_t * setting_about_create(lv_obj_t * activity_obj)
     lv_watch_obj_add_element(content);
 
     return obj;
+#endif
 }
 
 static void setting_about_prepare_destory(lv_obj_t * activity_obj)
index de3f300..4a92e20 100644 (file)
@@ -229,7 +229,7 @@ static void mmi_protocol_watch_heartbeat_timer_cb(uint32_t para)
        {
                PROTOCOL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: cur=%d, stamp=%d\n", __FUNCTION__, __LINE__, cur_time_stamp, s_watch_heartbeat_action_time_stamp);
                
-               mmi_protocol_action_link();
+               mmi_protocol_fzd_action_HEARTBEAT();
                s_watch_heartbeat_action_time_stamp = cur_time_stamp;
        }
 
@@ -243,7 +243,7 @@ void mmi_protocol_watch_heartbeat_action(void)
        {
                PROTOCOL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
                
-               mmi_protocol_action_link();
+               mmi_protocol_fzd_action_HEARTBEAT();
                
                Hal_Rtc_Gettime_Count(&s_watch_heartbeat_action_time_stamp);
 
@@ -252,10 +252,12 @@ void mmi_protocol_watch_heartbeat_action(void)
        }
 }
 
-bool mmi_protocol_action_link(void)
+#ifdef __MMI_ZHSX_SUPPORT_FZD_SERVER_WULIAN__
+bool mmi_protocol_watch_link_action(void)
 {
-       return mmi_protocol_fzd_action_link();
+       return mmi_protocol_fzd_action_LINK();
 }
+#endif
 
 bool mmi_protocol_check_state_before_send_action(void)
 {
index 26876fb..d043e1b 100644 (file)
@@ -62,7 +62,9 @@ void mmi_protocol_watch_timed_mission_action(void);
 void mmi_protocol_watch_heartbeat_stop(void);
 void mmi_protocol_watch_heartbeat_action(void);
 
-bool mmi_protocol_action_link(void);
+#ifdef __MMI_ZHSX_SUPPORT_FZD_SERVER_WULIAN__
+bool mmi_protocol_watch_link_action(void);
+#endif
 
 bool mmi_protocol_action_send_temperature(float temp_value);
 
index b895a8a..81364b0 100644 (file)
@@ -38,7 +38,7 @@ int mmi_protocol_fzd_convert_md5_data_get(MMI_PROTOCOL_FZD_ACTION_ENUM action, i
 
        unsigned char action_str[MMI_PROTOCOL_FZD_ACTION_STR_LEN_MAX + 1] = {0};
        int action_str_len = 0;
-       strcpy(action_str, mmi_protocol_fzd_action_string_get(action));
+       strncpy(action_str, mmi_protocol_fzd_action_string_get(action), MMI_PROTOCOL_FZD_ACTION_STR_LEN_MAX);
        action_str_len = strlen(action_str);
 
        //device name
@@ -179,7 +179,7 @@ static bool mmi_protocol_fzd_send_content_construct(MMI_PROTOCOL_FZD_ACTION_ENUM
 {
        unsigned char * send_space_ptr = NULL;
        int send_space_size = 0, curr_offset = 0;
-       unsigned char convert_md5_str[48] = {0}; // XX*IMEI*LEN*ACTION
+       unsigned char convert_md5_str[96] = {0}; // XX*IMEI*LEN*ACTION
        int convert_md5_str_len = 0;
        unsigned char md5_data_str[MMI_PROTOCOL_FZD_MD5_DATA_LEN + 1] = {0};
 
@@ -481,7 +481,10 @@ static unsigned char * mmi_protocol_fzd_action_string_get(MMI_PROTOCOL_FZD_ACTIO
            {
                        {MMI_FZD_ACTION_NONE, "NONE"},          //MMI_FZD_ACTION_NONE
                        
-               {MMI_FZD_ACTION_LINK, "KA"},                    //MMI_FZD_ACTION_LINK
+               #ifdef __MMI_ZHSX_SUPPORT_FZD_SERVER_WULIAN__
+                       {MMI_FZD_ACTION_LINK, "LK"},
+               #endif
+               {MMI_FZD_ACTION_HEARTBEAT, "KA"},
                        {MMI_FZD_ACTION_BIND, "PING"},          //
                        {MMI_FZD_ACTION_GET_TIME, "LGZONE"},            //
                        {MMI_FZD_ACTION_SEND_LOCATION, "UD"},                   //
@@ -518,13 +521,14 @@ static unsigned char * mmi_protocol_fzd_action_string_get(MMI_PROTOCOL_FZD_ACTIO
                        {MMI_FZD_ACTION_UNBIND, "DLT"},
 
                #ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__
-                       {MMI_FZD_WATCH_GET_VC_CONFIG, "juhoo_config"},
+                       {MMI_FZD_WATCH_GET_VC_CONFIG, "jup_hoo_config"},
                        {MMI_FZD_WATCH_GET_VC_CONTACT, "video_contact"},
+                       
                        {MMI_FZD_WATCH_VC_CALL_REQUEST, "jup_hoo_call"},
                        {MMI_FZD_SERVER_VC_CALL_RESPONSE, "jup_hoo_reply"},
                
-
-               
+                       {MMI_FZD_SERVER_VC_CALL_REQUEST, "jup_hoo_request"},
+                       {MMI_FZD_WATCH_VC_CALL_RESPONSE, "jup_hoo_response"},
                #endif
 
                
@@ -572,8 +576,14 @@ static bool mmi_protocol_fzd_content_parse(unsigned char * content_ptr, unsigned
 
        switch(action)
        {
+               #ifdef __MMI_ZHSX_SUPPORT_FZD_SERVER_WULIAN__
                case MMI_FZD_ACTION_LINK:
-                       mmi_protocol_fzd_parse_ACTION_LINK(next_buff, next_buff_len);
+                       mmi_protocol_fzd_parse_LINK(next_buff, next_buff_len);
+                       break;
+               #endif
+               
+               case MMI_FZD_ACTION_HEARTBEAT:
+                       mmi_protocol_fzd_parse_HEARTBEAT(next_buff, next_buff_len);
                        break;
 
                case MMI_FZD_ACTION_BIND:
@@ -699,6 +709,12 @@ static bool mmi_protocol_fzd_content_parse(unsigned char * content_ptr, unsigned
                        mmi_protocol_fzd_parse_SERVER_VC_CALL_RESPONSE(next_buff, next_buff_len);
                        break;
                
+               case MMI_FZD_SERVER_VC_CALL_REQUEST:
+                       mmi_protocol_fzd_parse_SERVER_VC_CALL_REQUEST(next_buff, next_buff_len);
+                       break;
+                       
+               case MMI_FZD_WATCH_VC_CALL_RESPONSE:
+                       break;
        #endif
 
                         
@@ -710,10 +726,24 @@ static bool mmi_protocol_fzd_content_parse(unsigned char * content_ptr, unsigned
 }
 
 
-bool mmi_protocol_fzd_action_link(void)
+#ifdef __MMI_ZHSX_SUPPORT_FZD_SERVER_WULIAN__
+bool mmi_protocol_fzd_action_LINK(void)
+{
+       return mmi_protocol_fzd_send_without_data(MMI_FZD_ACTION_LINK);
+}
+
+bool mmi_protocol_fzd_parse_LINK(unsigned char * next_buff, unsigned int next_buff_len)
+{
+       mmi_protocol_watch_heartbeat_action();
+
+       return true;
+}
+#endif
+
+bool mmi_protocol_fzd_action_HEARTBEAT(void)
 {
        bool result = false;
-       MMI_PROTOCOL_FZD_ACTION_ENUM action = MMI_FZD_ACTION_LINK;
+       MMI_PROTOCOL_FZD_ACTION_ENUM action = MMI_FZD_ACTION_HEARTBEAT;
        unsigned char * content_buff = NULL;
        unsigned int content_lenth = 0;
     hal_rtc_t cur_time = {0};
@@ -740,7 +770,7 @@ bool mmi_protocol_fzd_action_link(void)
        return result;
 }
 
-bool mmi_protocol_fzd_parse_ACTION_LINK(unsigned char * next_buff, unsigned int next_buff_len)
+bool mmi_protocol_fzd_parse_HEARTBEAT(unsigned char * next_buff, unsigned int next_buff_len)
 {
        if(true != mmi_protocol_watch_bind_state_get())
        {
@@ -785,7 +815,9 @@ bool mmi_protocol_fzd_parse_ACTION_BIND(unsigned char * next_buff, unsigned int
                if(1 == value)
                {
                        mmi_protocol_watch_bind_state_set(true);
+                       #if 0
                        mmi_protocol_watch_timed_mission_action();
+                       #endif
 
                        //video call
                        mmi_protocol_fzd_action_get_vc_config();
@@ -2042,12 +2074,12 @@ bool mmi_protocol_fzd_parse_WATCH_GET_VC_CONTACT(unsigned char * next_buff, unsi
        }
 
        t_vc_contact.total = i;
-       mmi_video_call_contact_set(&t_vc_contact);
+       mmi_vc_contact_set(&t_vc_contact);
 
        return result;
 }
 
-bool mmi_protocol_fzd_action_send_vc_call(char * number, uint8_t call_type)
+bool mmi_protocol_fzd_action_VC_CALL_REQUEST(char * number, uint8_t call_type)
 {
        bool result = false;
        MMI_PROTOCOL_FZD_ACTION_ENUM action = MMI_FZD_WATCH_VC_CALL_REQUEST;
@@ -2056,7 +2088,7 @@ bool mmi_protocol_fzd_action_send_vc_call(char * number, uint8_t call_type)
 
        sprintf(content_buff, ",%s,%d", number, call_type);
        content_lenth = strlen(content_buff);
-       
+
        result = mmi_protocol_fzd_send_with_data(action, content_buff, content_lenth);
 
        return result;
@@ -2107,22 +2139,66 @@ bool mmi_protocol_fzd_parse_SERVER_VC_CALL_RESPONSE(unsigned char * next_buff, u
        result = true;
        mmi_protocol_fzd_send_without_data(action);
 
-       char * t_tokens = NULL;
-       char * t_appkey = NULL;
-       char * t_key = NULL;
+       uint8_t t_value = 0;
 
-       t_tokens = km_strtok_r(NULL, ",", &next_buff);
-       t_appkey = km_strtok_r(NULL, ",", &next_buff);
-       t_key = km_strtok_r(NULL, ",", &next_buff);
+       t_value = atoi(next_buff);
+       if(0 == t_value)
+       {
+               // the other party is reject
+
+               
+       }
+       else
+       {
+               // connect
+               mmi_vc_call_action_connect();
+       }
        
-       mmi_video_call_jrtc_config_init_01(t_appkey, t_key, t_tokens);
+       return result;
+}
 
-       //get contact
-       mmi_protocol_fzd_action_get_vc_contact();
+bool mmi_protocol_fzd_parse_SERVER_VC_CALL_REQUEST(unsigned char * next_buff, unsigned int next_buff_len)
+{
+       bool result = false;
+       MMI_PROTOCOL_FZD_ACTION_ENUM action = MMI_FZD_SERVER_VC_CALL_REQUEST;
+
+       if(NULL == next_buff || 0 == next_buff_len)
+       {
+               PROTOCOL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               return false;
+       }
+
+       result = true;
+       mmi_protocol_fzd_send_without_data(action);
+
+       char * t_ptr = NULL;
+       char t_number[NV_WATCH_VC_CONTACT_NUMBER_LEN] = {0};
+       uint8_t t_calltype = 0;
+
+       t_ptr = km_strtok_r(NULL, ",", &next_buff);
+       strncpy(t_number, t_ptr, NV_WATCH_VC_CONTACT_NUMBER_LEN - 1); 
+       t_calltype = atoi(next_buff);
+
+       mmi_vc_call_action_incoming(t_number, t_calltype);
        
        return result;
 }
 
+// state: 1£ºaccept; 0£ºreject
+bool mmi_protocol_fzd_action_VC_CALL_RESPONSE(char * number, uint8_t state)
+{
+       bool result = false;
+       MMI_PROTOCOL_FZD_ACTION_ENUM action = MMI_FZD_WATCH_VC_CALL_RESPONSE;
+       unsigned char content_buff[NV_WATCH_VC_CONTACT_NUMBER_LEN + 8] = {0};
+       unsigned int content_lenth = 0;
+
+       sprintf(content_buff, ",%s,%d", number, state);
+       content_lenth = strlen(content_buff);
+
+       result = mmi_protocol_fzd_send_with_data(action, content_buff, content_lenth);
+
+       return result;
+}
 
 #endif
 
index 64b9959..d9e3055 100644 (file)
@@ -26,19 +26,27 @@ FORMAT: [MD5_DATADEVICE_NAME*DEVICE_ID*CONTENT_LENGTH*CONTENT_KEY,CONTENT_VALUE]
 
 ****************************************/
 
+#ifdef __MMI_ZHSX_SUPPORT_FZD_SERVER_WULIAN__
+#define MMI_PROTOCOL_FZD_MD5_KEY_STR   "3JyCjsw4ryXKzjzudayY"
+#else
 #define MMI_PROTOCOL_FZD_MD5_KEY_STR   "bZld0ALsZTt15tKEZhOlLPgbsO75BLTP" // "FDF9532BB5914C0F9D0999CAF99DEBB9" // "XMQcHi0lGIdru6xzW7lygBwBT8N0c09P"
-#define MMI_PROTOCOL_FZD_MD5_KEY_LEN   (32)
+#endif
+#define MMI_PROTOCOL_FZD_MD5_KEY_LEN   (strlen(MMI_PROTOCOL_FZD_MD5_KEY_STR)) // (32)
 #define MMI_PROTOCOL_FZD_MD5_DATA_LEN  (32)
 
 
 #define MMI_PROTOCOL_FZD_HEAD_BRACKET          "["
 #define MMI_PROTOCOL_FZD_BRACKET_LEN           (strlen(MMI_PROTOCOL_FZD_HEAD_BRACKET))
+#ifdef __MMI_ZHSX_SUPPORT_FZD_SERVER_WULIAN__
+#define MMI_PROTOCOL_FZD_DEVICE_NAME           "qAELPTKmFanR4RHe"
+#else
 #define MMI_PROTOCOL_FZD_DEVICE_NAME           "SZKW" // "ZHSX"
+#endif
 #define MMI_PROTOCOL_FZD_DEVICE_NAME_LEN       (strlen(MMI_PROTOCOL_FZD_DEVICE_NAME))
 #define MMI_PROTOCOL_FZD_SEPARATOR                     "*"
 #define MMI_PROTOCOL_FZD_SEPARATOR_LEN         (strlen(MMI_PROTOCOL_FZD_SEPARATOR))
 #define MMI_PROTOCOL_FZD_TAIL_BRACKET          "]"
-#define MMI_PROTOCOL_FZD_DEVICE_ID_LEN         (15)
+#define MMI_PROTOCOL_FZD_DEVICE_ID_LEN         (15) // imei
 #define MMI_PROTOCOL_FZD_CONTENT_LEN_LEN       (4)
 
 // send fixed:[MD5_DATADEVICE_NAME*DEVICE_ID*CONTENT_LENGTH*]
@@ -49,7 +57,7 @@ FORMAT: [MD5_DATADEVICE_NAME*DEVICE_ID*CONTENT_LENGTH*CONTENT_KEY,CONTENT_VALUE]
                                                                                                + MMI_PROTOCOL_FZD_SEPARATOR_LEN * 3 + MMI_PROTOCOL_FZD_DEVICE_ID_LEN + MMI_PROTOCOL_FZD_CONTENT_LEN_LEN)
 
 
-#define MMI_PROTOCOL_FZD_ACTION_STR_LEN_MAX            (15) // "LK"
+#define MMI_PROTOCOL_FZD_ACTION_STR_LEN_MAX            (31) // "LK"
 
 
 #define FZD_MAX(a, b)  (((a) > (b)) ? (a) : (b))
@@ -84,7 +92,10 @@ typedef enum
 {
     MMI_FZD_ACTION_NONE,       //0 nothing
 
-       MMI_FZD_ACTION_LINK, // tcp heartbeat
+#ifdef __MMI_ZHSX_SUPPORT_FZD_SERVER_WULIAN__
+       MMI_FZD_ACTION_LINK,
+#endif
+       MMI_FZD_ACTION_HEARTBEAT, // tcp heartbeat
        MMI_FZD_ACTION_BIND, // 
        MMI_FZD_ACTION_GET_TIME,
        MMI_FZD_ACTION_SEND_LOCATION,
@@ -127,7 +138,8 @@ typedef enum
        MMI_FZD_WATCH_VC_CALL_REQUEST,
        MMI_FZD_SERVER_VC_CALL_RESPONSE,
 
-
+       MMI_FZD_SERVER_VC_CALL_REQUEST,
+       MMI_FZD_WATCH_VC_CALL_RESPONSE,
 #endif
 
 
@@ -167,9 +179,15 @@ void mmi_protocol_fzd_send_space_deinit(MMI_PROTOCOL_FZD_ACTION_ENUM action);
 
 bool mmi_protocol_fzd_send_cmd_check(MMI_PROTOCOL_FZD_ACTION_ENUM action);
 
-bool mmi_protocol_fzd_action_link(void);
+#ifdef __MMI_ZHSX_SUPPORT_FZD_SERVER_WULIAN__
+bool mmi_protocol_fzd_action_LINK(void);
+
+bool mmi_protocol_fzd_parse_LINK(unsigned char * next_buff, unsigned int next_buff_len);
+#endif
+
+bool mmi_protocol_fzd_action_HEARTBEAT(void);
 
-bool mmi_protocol_fzd_parse_ACTION_LINK(unsigned char * next_buff, unsigned int next_buff_len);
+bool mmi_protocol_fzd_parse_HEARTBEAT(unsigned char * next_buff, unsigned int next_buff_len);
 
 bool mmi_protocol_fzd_action_bind(void);
 
index b19c132..751708b 100644 (file)
@@ -110,7 +110,7 @@ void mmi_watch_search_screen_destroy(void)
        Hal_Vibrator_Play_End();
        
        lv_watch_png_cache_all_free();
-       lv_obj_del_async(lv_watch_get_activity_obj(ACT_ID_WATCH_SEARCHING));
+       //lv_obj_del_async(lv_watch_get_activity_obj(ACT_ID_WATCH_SEARCHING));
 
        watch_set_suspend_enable(true, ACT_ID_WATCH_SEARCHING, 0);
 }
@@ -133,6 +133,11 @@ lv_obj_t * mmi_watch_server_search_screen_create(lv_obj_t * activity_obj)
        {
                return NULL;
        }
+
+       if(NULL != lv_watch_get_activity_obj(ACT_ID_WATCH_SEARCHING))
+       {
+               return NULL;
+       }
        
        lv_watch_png_cache_all_free();
     if(NULL == activity_obj) 
@@ -155,7 +160,7 @@ lv_obj_t * mmi_watch_server_search_screen_create(lv_obj_t * activity_obj)
        lv_obj_t * cont = lv_cont_create(obj, NULL);
        lv_obj_set_size(cont, lv_obj_get_width(obj), lv_obj_get_height(obj));
        lv_obj_align(cont, obj, LV_ALIGN_CENTER, 0, 0);
-       lv_obj_set_style_local_bg_color(cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, lv_color_make(0, 0, 0));
+       lv_obj_set_style_local_bg_color(cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, lv_color_make(0, 0, 0)); // LV_COLOR_BLACK
        lv_obj_set_click(cont, true);
        lv_obj_set_event_cb(cont, mmi_watch_search_screen_event_cb);    
        //lv_obj_add_protect(cont, LV_PROTECT_PRESS_LOST);
index 48fa9dc..419a6a2 100644 (file)
@@ -31,7 +31,11 @@ void cmdmsg_handler_login_impl(void *param)
 #ifdef __MMI_ZHSX_SUPPORT__
        printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__);
 
+       #ifdef __MMI_ZHSX_SUPPORT_FZD_SERVER_WULIAN__
+       mmi_protocol_watch_link_action();
+       #else
        mmi_protocol_watch_heartbeat_action();
+       #endif
 
 #else
 
index f60e644..20e0b8e 100644 (file)
@@ -440,7 +440,7 @@ static void indev_pointer_proc(lv_indev_t * i, lv_indev_data_t * data)
  */
 static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data)
 {
-       printf("[@CHENG_DEBUG][%s][%d]: key=%d\n", __FUNCTION__, __LINE__, data->key);
+       //printf("[@CHENG_DEBUG][%s][%d]: key=%d\n", __FUNCTION__, __LINE__, data->key);
        
 #if LV_USE_GROUP
     if(data->state == LV_INDEV_STATE_PR && i->proc.wait_until_release) return;