gengxin
authorCCC <2393524978@qq.com>
Wed, 8 Nov 2023 01:57:34 +0000 (09:57 +0800)
committerCCC <2393524978@qq.com>
Wed, 8 Nov 2023 01:57:34 +0000 (09:57 +0800)
14 files changed:
2.sdk/sdk/gui/lv_watch/CMakeLists.txt
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_jrtc_client_fzd.c
2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_jrtc_client_tongxin.c
2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_jrtc_client_wulian.c [new file with mode: 0644]
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/mmi_video_call/mmi_video_call_fzd.c
2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_fzd.h
2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_tongxin.c
2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_tongxin.h
2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_wulian.c [new file with mode: 0644]
2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_wulian.h [new file with mode: 0644]
2.sdk/sdk/gui/lv_watch/lv_watch.h

index b345de7..2967c72 100644 (file)
@@ -206,10 +206,6 @@ set(lv_watch_sources
 #video call
        lv_apps/mmi_video_call/mmi_video_call.c
        lv_apps/mmi_video_call/mmi_jrtc_client.c
-       lv_apps/mmi_video_call/mmi_video_call_fzd.c
-       lv_apps/mmi_video_call/mmi_jrtc_client_fzd.c
-       lv_apps/mmi_video_call/mmi_video_call_tongxin.c
-       lv_apps/mmi_video_call/mmi_jrtc_client_tongxin.c
 #wechat
        lv_apps/mmi_wechat/wechat_ui.c
 #health_measure
index db61ad6..00080ba 100644 (file)
 #include "lv_watch.h"
 
 #ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__
-#if defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_WULIAN__)
 
 //#include <jrtc.h>
 #include "../../../../product/craneg_modem/framework/inc/jrtc.h"
 
 
-typedef enum jrtc_state video_call_jrtc_state_e;
-typedef enum jrtc_error video_call_jrtc_error_e;
-typedef struct jrtc_image_t video_call_jrtc_image_t;
-
-typedef struct 
-{
-    void /*lv_task_t*/ *state_task;
-    video_call_jrtc_image_t txframe;
-    video_call_jrtc_image_t rxframe;
-    void* jrtc_ptr;
-    TIMER_ID closed_timer_id;
-    uint8_t closing;
-} MMI_VIDEO_CALL_JRTC_T;
-
-
-static MMI_VIDEO_CALL_JRTC_T s_video_call_jrtc;
-
-
-static uint8_t voip_jrtc_get_image(void * preview_buf);
-
-extern UINT32  OsaGetTicks(void *pForFutureUse);
-
-
-void mmi_video_call_jrtc_config_init_00(void)
-{
-#ifdef __VIDEO_CALL_TEST__
-       char appkey[24+1] = "dc1db81c19d1da4f5fb4a197";
-       char key[16+1] = "K75A1vS562671d38";
-       char uid[64+1] = {0};
-       char tokens[128+1] = "";
-       
-       char imei[16] = {0};
-       app_adp_get_imei_req(imei);
-       strncpy(uid, imei, 16);
-
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       
-       jrtc_config(appkey, uid, key, tokens);
-    Hal_Mem_Set(&s_video_call_jrtc, 0x0, sizeof(MMI_VIDEO_CALL_JRTC_T));
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__
+#include "mmi_jrtc_client_fzd.c"
 #endif
-}
-
-void mmi_video_call_jrtc_config_init_01(char * t_appkey, char * t_key, char * t_tokens)
-{
-#ifndef __VIDEO_CALL_TEST__
-       char appkey[24+1] = {0};
-       char key[16+1] = {0};
-       char uid[64+1] = {0};
-       char tokens[128+1] = {0};
-       
-       char imei[16] = {0};
-       app_adp_get_imei_req(imei);
-       strncpy(uid, imei, 16);
-
-       //VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s\n", __FUNCTION__, __LINE__, t_tokens);
-       //VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s\n", __FUNCTION__, __LINE__, t_tokens+32);
-       //VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s\n", __FUNCTION__, __LINE__, t_tokens+64); 
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%d,%d\n", __FUNCTION__, __LINE__, strlen(t_appkey),  strlen(t_key), strlen(t_tokens));
-
-       memcpy(appkey, t_appkey, 24);
-       memcpy(key, t_key, 16);
-       memcpy(tokens, t_tokens, 128);
-
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%s\n", __FUNCTION__, __LINE__, strlen(appkey), appkey);
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%s\n", __FUNCTION__, __LINE__, strlen(uid), uid);
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%s\n", __FUNCTION__, __LINE__, strlen(key), key);
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%s\n", __FUNCTION__, __LINE__, strlen(tokens), tokens);
-       
-       jrtc_config(appkey, uid, key, tokens);
-       Hal_Mem_Set(&s_video_call_jrtc, 0x0, sizeof(MMI_VIDEO_CALL_JRTC_T));
-#endif
-}
-
-static void mmi_video_call_jrtc_clean_up(void)
-{
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-    if(NULL != s_video_call_jrtc.state_task) 
-       {
-               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               
-        lv_task_del(s_video_call_jrtc.state_task);
-    }
-
-    Hal_Mem_Set(&s_video_call_jrtc, 0x0, sizeof(MMI_VIDEO_CALL_JRTC_T));
-}
-
-static void mmi_video_call_jrtc_timeout_cb(void * para)
-{
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-    mmi_video_call_jrtc_clean_up();
-}
-
-static void mmi_video_call_jrtc_on_state(lv_task_t * task)
-{
-    static int8_t oldstate = -1;
-    video_call_jrtc_state_e state = jrtc_state(s_video_call_jrtc.jrtc_ptr);
-
-    if(state != oldstate) 
-       {
-               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: oldstate=%d,state=%d\n", __FUNCTION__, __LINE__, oldstate, state);
-    }
-
-    switch(state) 
-       {
-           case JRTC_CLOSED:
-               if((NULL != s_video_call_jrtc.jrtc_ptr) && (NULL == s_video_call_jrtc.closed_timer_id)) 
-                       {
-                       video_call_jrtc_error_e err = jrtc_error(s_video_call_jrtc.jrtc_ptr);
-                               
-                               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: error=%d\n", __FUNCTION__, __LINE__, err);
-
-                   if(!s_video_call_jrtc.closing) 
-                               {
-                       jrtc_close(s_video_call_jrtc.jrtc_ptr, JRTC_ENIL);
-                       s_video_call_jrtc.closing = 1;
-                   }
-
-                   s_video_call_jrtc.closed_timer_id = Hal_Timer_Start(100, mmi_video_call_jrtc_timeout_cb, NULL, 0);
-               }
-
-               if(MMI_VIDEO_CALL_STATE_NONE != mmi_video_call_params_state_get()) 
-                       {
-                   mmi_vc_ring_off_no_carrier(1);
-               }
-               break;
-
-           case JRTC_LEAVING:
-               break;
-
-           case JRTC_OPENED:
-               break;
-
-           case JRTC_JOINING:
-               break;
-
-           case JRTC_JOINED:
-               break;
 
-           case JRTC_TALKING:
-                       mmi_vc_call_action_connected();
-
-               /* Get image */
-               if (MODEM_VIDEO_CALL_TYPE_VIDEO == mmi_video_call_params_type_get()) 
-                       {
-                   void *buf = mmi_video_call_phone_get_video_buffer();
-                   if(voip_jrtc_get_image(buf)) 
-                               {
-                       lv_canvas_set_buffer(mmi_vc_call_get_ext()->canvas, buf, canvas_width, canvas_heigh, LV_IMG_CF_TRUE_COLOR);
-                   }
-               }
-               break;
-
-           default:
-               break;
-    }
-
-    oldstate = state;
-}
-
-
-static int8_t mmi_video_call_jrtc_open(const char* roomid, MODEM_VIDEO_CALL_TYPE calltype)
-{
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__, roomid, calltype);
-
-#ifdef __VIDEO_CALL_TEST__
-       char * ticket = NULL;
-#else
-       char ticket[64+8] = "ab2671af32b7278ca5e7ad9e26b488aff6640569eaa5b8e1f690d8ac298f6e61";
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_TONGXIN__
+#include "mmi_jrtc_client_tongxin.c"
 #endif
-       
-    Hal_Mem_Set(&s_video_call_jrtc, 0, sizeof(MMI_VIDEO_CALL_JRTC_T));
-       
-    if (MODEM_VIDEO_CALL_TYPE_VIDEO == calltype) 
-       {
-        s_video_call_jrtc.rxframe.width  = s_video_call_jrtc.txframe.width  = 176;
-        s_video_call_jrtc.rxframe.height = s_video_call_jrtc.txframe.height = 144;
-        s_video_call_jrtc.rxframe.fps    = s_video_call_jrtc.txframe.fps    = 8; // 10;
-        s_video_call_jrtc.rxframe.kbps   = s_video_call_jrtc.txframe.kbps   = 120; // 240;
-
-               mci_videocall_camera_set_sensor(1); // 0:rear camera; 1:front camera
-               
-        s_video_call_jrtc.jrtc_ptr= jrtc_open(roomid, ticket, &s_video_call_jrtc.rxframe, &s_video_call_jrtc.txframe);
-    } 
-       else 
-       {
-        s_video_call_jrtc.jrtc_ptr= jrtc_open(roomid, ticket, NULL, NULL);
-    }
-
-    if (!s_video_call_jrtc.jrtc_ptr) 
-       {
-               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-        mmi_video_call_jrtc_clean_up();
-        return -1;
-    }
-    jrtc_activate(s_video_call_jrtc.jrtc_ptr, JRTC_AUDIO|JRTC_CAMERA);
-
-    s_video_call_jrtc.state_task = lv_task_create(mmi_video_call_jrtc_on_state, VIDEO_RENDER_PERIOD, LV_TASK_PRIO_HIGH, NULL);
-    return 0;
-}
-
-int8_t mmi_video_call_dial_req(MODEM_VIDEO_CALL_TYPE calltype, char * pContactUri)
-{
-    int8_t ret = -1;
-
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%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);
-       }
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %p, %d\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr, ret);
-
-    return ret;
-}
-
-void mmi_video_call_hangup_req(BOOL bye)
-{
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, 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;
 
-               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %p,%d\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr, err);
-               
-        jrtc_close(s_video_call_jrtc.jrtc_ptr, err);
-        s_video_call_jrtc.closing = 1;
-    } 
-       else
-       {
-        mmi_vc_ring_off_no_carrier(0);
-    }
-}
-
-int8_t mmi_video_call_answer_req(void)
-{
-    int8_t ret = -1;
-
-       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());
-       }
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %p, %d\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr, ret);
-       
-    return ret;
-}
-
-void mmi_video_call_reject_req(BOOL bye)
-{
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, 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;
-
-               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %p,%d\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr, err);
-               
-        jrtc_close(s_video_call_jrtc.jrtc_ptr, err);
-        s_video_call_jrtc.closing = 1;
-    } 
-       else 
-       {
-        mmi_vc_ring_off_no_carrier(0);
-    }
-}
-
-
-//extern unsigned yuv420_scale(int src_width, int src_height, int dst_width, int dst_height,     unsigned char *src_buf, unsigned char *dst_buf, unsigned char semi);
-//extern unsigned rgb565_scale(int32_t src_width, int32_t src_height, int32_t dst_width, int32_t dst_height, uint8_t *src_buf, uint8_t *dst_buf);
-//extern void yuv420_2_rgb565(int width, int height, const unsigned char *src, unsigned short *dst, unsigned semi);
-
-static uint8_t voip_jrtc_get_image(void * preview_buf)
-{
-    uint8_t ret = 0;
-    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
-    LV_ASSERT_MEM(ext);
-
-    video_call_jrtc_image_t * frame = NULL;
-    if(ext->local_remote_switch_flag == VOIP_REMOTE_SWITCH_REMOTE)
-        frame = &s_video_call_jrtc.rxframe;
-    else
-        frame = &s_video_call_jrtc.txframe;
-
-    if (frame->put != frame->get) {
-#if (ENABLE_VIDEO_SCALE == 0)
-        yuv420_2_rgb565(frame->width, frame->height, frame->data, preview_buf, frame->format);
-#else
-        Hal_Yuv420_Render(frame->width, frame->height, canvas_width, canvas_heigh, frame->data, preview_buf, frame->format);
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_WULIAN__
+#include "mmi_jrtc_client_wulian.c"
 #endif
 
-        frame->get = frame->put;
-        ret = 1;
-        voip_fps_check(frame->fps);
-    }
-
-    return ret;
-}
-
-#endif
 #endif
 
index c723cc8..16f1956 100644 (file)
@@ -3,12 +3,8 @@
 
 #include "lv_watch.h"
 
-#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__
 #ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__
 
-//#include <jrtc.h>
-#include "../../../../product/craneg_modem/framework/inc/jrtc.h"
-
 
 typedef enum jrtc_state video_call_jrtc_state_e;
 typedef enum jrtc_error video_call_jrtc_error_e;
@@ -312,5 +308,4 @@ static uint8_t voip_jrtc_get_image(void * preview_buf)
 }
 
 #endif
-#endif
 
index 310a76a..eb2b53e 100644 (file)
@@ -3,12 +3,8 @@
 
 #include "lv_watch.h"
 
-#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__
 #ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_TONGXIN__
 
-//#include <jrtc.h>
-#include "../../../../product/craneg_modem/framework/inc/jrtc.h"
-
 
 typedef enum jrtc_state video_call_jrtc_state_e;
 typedef enum jrtc_error video_call_jrtc_error_e;
@@ -301,5 +297,4 @@ static uint8_t voip_jrtc_get_image(void * preview_buf)
 }
 
 #endif
-#endif
 
diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_jrtc_client_wulian.c b/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_jrtc_client_wulian.c
new file mode 100644 (file)
index 0000000..d702a90
--- /dev/null
@@ -0,0 +1,318 @@
+
+
+
+#include "lv_watch.h"
+
+#if defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_WULIAN__)
+
+
+typedef enum jrtc_state video_call_jrtc_state_e;
+typedef enum jrtc_error video_call_jrtc_error_e;
+typedef struct jrtc_image_t video_call_jrtc_image_t;
+
+typedef struct 
+{
+    void /*lv_task_t*/ *state_task;
+    video_call_jrtc_image_t txframe;
+    video_call_jrtc_image_t rxframe;
+    void* jrtc_ptr;
+    TIMER_ID closed_timer_id;
+    uint8_t closing;
+} MMI_VIDEO_CALL_JRTC_T;
+
+
+static MMI_VIDEO_CALL_JRTC_T s_video_call_jrtc;
+
+
+static uint8_t voip_jrtc_get_image(void * preview_buf);
+
+extern UINT32  OsaGetTicks(void *pForFutureUse);
+
+
+void mmi_video_call_jrtc_config_init_00(void)
+{
+#ifdef __VIDEO_CALL_TEST__
+       char appkey[24+1] = "dc1db81c19d1da4f5fb4a197";
+       char key[16+1] = "K75A1vS562671d38";
+       char uid[64+1] = {0};
+       char tokens[128+1] = "";
+       
+       char imei[16] = {0};
+       app_adp_get_imei_req(imei);
+       strncpy(uid, imei, 16);
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+       jrtc_config(appkey, uid, key, tokens);
+    Hal_Mem_Set(&s_video_call_jrtc, 0x0, sizeof(MMI_VIDEO_CALL_JRTC_T));
+#endif
+}
+
+void mmi_video_call_jrtc_config_init_01(char * t_appkey, char * t_key, char * t_tokens)
+{
+#ifndef __VIDEO_CALL_TEST__
+       char appkey[24+1] = {0};
+       char key[16+1] = {0};
+       char uid[64+1] = {0};
+       char tokens[128+1] = {0};
+       
+       char imei[16] = {0};
+       app_adp_get_imei_req(imei);
+       strncpy(uid, imei, 16);
+
+       //VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s\n", __FUNCTION__, __LINE__, t_tokens);
+       //VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s\n", __FUNCTION__, __LINE__, t_tokens+32);
+       //VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s\n", __FUNCTION__, __LINE__, t_tokens+64); 
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%d,%d\n", __FUNCTION__, __LINE__, strlen(t_appkey),  strlen(t_key), strlen(t_tokens));
+
+       memcpy(appkey, t_appkey, 24);
+       memcpy(key, t_key, 16);
+       memcpy(tokens, t_tokens, 128);
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%s\n", __FUNCTION__, __LINE__, strlen(appkey), appkey);
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%s\n", __FUNCTION__, __LINE__, strlen(uid), uid);
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%s\n", __FUNCTION__, __LINE__, strlen(key), key);
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%s\n", __FUNCTION__, __LINE__, strlen(tokens), tokens);
+       
+       jrtc_config(appkey, uid, key, tokens);
+       Hal_Mem_Set(&s_video_call_jrtc, 0x0, sizeof(MMI_VIDEO_CALL_JRTC_T));
+#endif
+}
+
+static void mmi_video_call_jrtc_clean_up(void)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    if(NULL != s_video_call_jrtc.state_task) 
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               
+        lv_task_del(s_video_call_jrtc.state_task);
+    }
+
+    Hal_Mem_Set(&s_video_call_jrtc, 0x0, sizeof(MMI_VIDEO_CALL_JRTC_T));
+}
+
+static void mmi_video_call_jrtc_timeout_cb(void * para)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    mmi_video_call_jrtc_clean_up();
+}
+
+static void mmi_video_call_jrtc_on_state(lv_task_t * task)
+{
+    static int8_t oldstate = -1;
+    video_call_jrtc_state_e state = jrtc_state(s_video_call_jrtc.jrtc_ptr);
+
+    if(state != oldstate) 
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: oldstate=%d,state=%d\n", __FUNCTION__, __LINE__, oldstate, state);
+    }
+
+    switch(state) 
+       {
+           case JRTC_CLOSED:
+               if((NULL != s_video_call_jrtc.jrtc_ptr) && (NULL == s_video_call_jrtc.closed_timer_id)) 
+                       {
+                       video_call_jrtc_error_e err = jrtc_error(s_video_call_jrtc.jrtc_ptr);
+                               
+                               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: error=%d\n", __FUNCTION__, __LINE__, err);
+
+                   if(!s_video_call_jrtc.closing) 
+                               {
+                       jrtc_close(s_video_call_jrtc.jrtc_ptr, JRTC_ENIL);
+                       s_video_call_jrtc.closing = 1;
+                   }
+
+                   s_video_call_jrtc.closed_timer_id = Hal_Timer_Start(100, mmi_video_call_jrtc_timeout_cb, NULL, 0);
+               }
+
+               if(MMI_VIDEO_CALL_STATE_NONE != mmi_video_call_params_state_get()) 
+                       {
+                   mmi_vc_ring_off_no_carrier(1);
+               }
+               break;
+
+           case JRTC_LEAVING:
+               break;
+
+           case JRTC_OPENED:
+               break;
+
+           case JRTC_JOINING:
+               break;
+
+           case JRTC_JOINED:
+               break;
+
+           case JRTC_TALKING:
+                       mmi_vc_call_action_connected();
+
+               /* Get image */
+               if (MODEM_VIDEO_CALL_TYPE_VIDEO == mmi_video_call_params_type_get()) 
+                       {
+                   void *buf = mmi_video_call_phone_get_video_buffer();
+                   if(voip_jrtc_get_image(buf)) 
+                               {
+                       lv_canvas_set_buffer(mmi_vc_call_get_ext()->canvas, buf, canvas_width, canvas_heigh, LV_IMG_CF_TRUE_COLOR);
+                   }
+               }
+               break;
+
+           default:
+               break;
+    }
+
+    oldstate = state;
+}
+
+
+static int8_t mmi_video_call_jrtc_open(const char* roomid, MODEM_VIDEO_CALL_TYPE calltype)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__, roomid, calltype);
+
+#ifdef __VIDEO_CALL_TEST__
+       char * ticket = NULL;
+#else
+       char ticket[64+8] = "ab2671af32b7278ca5e7ad9e26b488aff6640569eaa5b8e1f690d8ac298f6e61";
+#endif
+       
+    Hal_Mem_Set(&s_video_call_jrtc, 0, sizeof(MMI_VIDEO_CALL_JRTC_T));
+       
+    if (MODEM_VIDEO_CALL_TYPE_VIDEO == calltype) 
+       {
+        s_video_call_jrtc.rxframe.width  = s_video_call_jrtc.txframe.width  = 176;
+        s_video_call_jrtc.rxframe.height = s_video_call_jrtc.txframe.height = 144;
+        s_video_call_jrtc.rxframe.fps    = s_video_call_jrtc.txframe.fps    = 8; // 10;
+        s_video_call_jrtc.rxframe.kbps   = s_video_call_jrtc.txframe.kbps   = 120; // 240;
+
+               mci_videocall_camera_set_sensor(1); // 0:rear camera; 1:front camera
+               
+        s_video_call_jrtc.jrtc_ptr= jrtc_open(roomid, ticket, &s_video_call_jrtc.rxframe, &s_video_call_jrtc.txframe);
+    } 
+       else 
+       {
+        s_video_call_jrtc.jrtc_ptr= jrtc_open(roomid, ticket, NULL, NULL);
+    }
+
+    if (!s_video_call_jrtc.jrtc_ptr) 
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+        mmi_video_call_jrtc_clean_up();
+        return -1;
+    }
+    jrtc_activate(s_video_call_jrtc.jrtc_ptr, JRTC_AUDIO|JRTC_CAMERA);
+
+    s_video_call_jrtc.state_task = lv_task_create(mmi_video_call_jrtc_on_state, VIDEO_RENDER_PERIOD, LV_TASK_PRIO_HIGH, NULL);
+    return 0;
+}
+
+int8_t mmi_video_call_dial_req(MODEM_VIDEO_CALL_TYPE calltype, char * pContactUri)
+{
+    int8_t ret = -1;
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%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);
+       }
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %p, %d\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr, ret);
+
+    return ret;
+}
+
+void mmi_video_call_hangup_req(BOOL bye)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, 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;
+
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %p,%d\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr, err);
+               
+        jrtc_close(s_video_call_jrtc.jrtc_ptr, err);
+        s_video_call_jrtc.closing = 1;
+    } 
+       else
+       {
+        mmi_vc_ring_off_no_carrier(0);
+    }
+}
+
+int8_t mmi_video_call_answer_req(void)
+{
+    int8_t ret = -1;
+
+       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());
+       }
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %p, %d\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr, ret);
+       
+    return ret;
+}
+
+void mmi_video_call_reject_req(BOOL bye)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, 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;
+
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %p,%d\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr, err);
+               
+        jrtc_close(s_video_call_jrtc.jrtc_ptr, err);
+        s_video_call_jrtc.closing = 1;
+    } 
+       else 
+       {
+        mmi_vc_ring_off_no_carrier(0);
+    }
+}
+
+
+//extern unsigned yuv420_scale(int src_width, int src_height, int dst_width, int dst_height,     unsigned char *src_buf, unsigned char *dst_buf, unsigned char semi);
+//extern unsigned rgb565_scale(int32_t src_width, int32_t src_height, int32_t dst_width, int32_t dst_height, uint8_t *src_buf, uint8_t *dst_buf);
+//extern void yuv420_2_rgb565(int width, int height, const unsigned char *src, unsigned short *dst, unsigned semi);
+
+static uint8_t voip_jrtc_get_image(void * preview_buf)
+{
+    uint8_t ret = 0;
+    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+    LV_ASSERT_MEM(ext);
+
+    video_call_jrtc_image_t * frame = NULL;
+    if(ext->local_remote_switch_flag == VOIP_REMOTE_SWITCH_REMOTE)
+        frame = &s_video_call_jrtc.rxframe;
+    else
+        frame = &s_video_call_jrtc.txframe;
+
+    if (frame->put != frame->get) {
+#if (ENABLE_VIDEO_SCALE == 0)
+        yuv420_2_rgb565(frame->width, frame->height, frame->data, preview_buf, frame->format);
+#else
+        Hal_Yuv420_Render(frame->width, frame->height, canvas_width, canvas_heigh, frame->data, preview_buf, frame->format);
+#endif
+
+        frame->get = frame->put;
+        ret = 1;
+        voip_fps_check(frame->fps);
+    }
+
+    return ret;
+}
+
+#endif
+
index 2e4b920..f609846 100644 (file)
 
 
 #ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__
-#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_WULIAN__
 
-#include "mmi_video_call.h"
 #include <stdio.h>
 #include <stdlib.h>
 
 
-//static lv_signal_cb_t ancestor_signal;
-#if VIDEO_SIGNAL_CHECK
-static lv_task_t * signal_check_task = NULL;
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__
+#include "mmi_video_call_fzd.c"
 #endif
-static lv_task_t * rat_check_task = NULL;
-
-static MMI_VIDEO_CALL_PARAMS_T s_video_call_params;
-lv_color_t g_cbuf[canvas_width * canvas_heigh + 8]  __attribute__((aligned(8)));
-
-/**********************
-*  STATIC PROTOTYPES
-**********************/
-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);
-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_phone_obj_hide_anim_end(lv_anim_t * anim);
-static void voip_anim_fp_dialing_ring(lv_obj_t * obj, int32_t x);
-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 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);
-
-
-void mmi_vc_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority)
-{
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, priority);
-       
-    if(AUDIO_CTRL_PRIORITY_2 > priority)
-    {
-        lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE);
-        if(activity_obj == NULL)
-       {
-                       return;
-       }
-        mmi_vc_activity_destroy_req();
-        Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
-    }
-}
-
-void * mmi_video_call_phone_get_video_buffer()
-{
-    return g_cbuf;
-}
-
-/**********************
-*   STATIC FUNCTIONS
-**********************/
-static lv_obj_t * mmi_vc_call_get_activity_obj(void)
-{
-    lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE);
-
-    return(activity_obj);
-}
-
-static lv_obj_t * mmi_vc_call_get_obj(void)
-{
-    lv_obj_t * watch_obj = NULL;
-
-    lv_obj_t * activity_obj = mmi_vc_call_get_activity_obj();
-
-    if(activity_obj) 
-       {
-        lv_watch_get_child_obj(activity_obj, lv_watch_obj_signal, &watch_obj);
-    }
-
-    return(watch_obj);
-}
-
-lv_vc_call_obj_ext_t * mmi_vc_call_get_ext(void)
-{
-    lv_vc_call_obj_ext_t * ext = NULL;
-    lv_obj_t * watch_obj = mmi_vc_call_get_obj();
-
-    if(watch_obj) 
-       {
-        ext = lv_obj_get_ext_attr(watch_obj);
-    }
-
-    return(ext);
-}
-
-static void mmi_vc_call_screen_clean(void)
-{
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-    lv_obj_t * slider_activit_obj = lv_watch_get_activity_obj(ACT_ID_SLIDER);
-
-    if(slider_activit_obj)
-       {
-        lv_obj_del(slider_activit_obj);
-    }
-
-    lv_obj_t * activity_obj = mmi_vc_call_get_activity_obj();
-    if(activity_obj) 
-       {
-        lv_obj_del(activity_obj);
-    }
-}
-
-static void voip_phone_left_slide_callback(lv_obj_t * obj)
-{
-    printf("%s %d\n", __FUNCTION__, __LINE__);
-        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);
-        }
-}
-
-static void voip_phone_right_slide_callback(lv_obj_t * obj)
-{
-    printf("%s %d\n", __FUNCTION__, __LINE__);
-    mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);
-}
-
-static void voip_phone_down_slide_callback(lv_obj_t * obj)
-{
-    printf("%s %d\n", __FUNCTION__, __LINE__);
-    voip_volume_btn_action(NULL, LV_EVENT_CLICKED);
-}
-
-static void voip_slider_action(lv_obj_t * slider, lv_event_t e)
-{
-    if(e == LV_EVENT_VALUE_CHANGED)
-    {
-        printf("%s %d\n", __FUNCTION__, __LINE__);
-
-        uint8_t v = lv_slider_get_value(slider);
-
-        // set speaker volume
-        if(!Hal_Set_BT_Audio_Path((HAL_SPEAKER_GAIN)v))
-            Hal_Call_Speaker(HAL_CALL_SPK_ON, (HAL_SPEAKER_GAIN)v);
-        s_video_call_params.speaker_volume = v;
-    }
-}
-
-static void voip_volume_btn_action(lv_obj_t * obj, lv_event_t e)
-{
-    if(LV_EVENT_CLICKED != e) {
-        return;
-    }
-
-    printf("%s %d\n", __FUNCTION__, __LINE__);
-    slider_create(NULL, SETTING_VOIP_SPEAKER, 40, voip_slider_action);
-}
-
-static void voip_phone_obj_hide_anim_end(lv_anim_t * anim)
-{
-    (void)anim;
-    printf("%s %d\n", __FUNCTION__, __LINE__);
-
-    mmi_vc_call_screen_clean();
-}
-
-static void mmi_vc_get_time_elaps(uint32_t last_time, char * str, int8_t size)
-{
-    hal_rtc_t rtc_curr;            // current rtc time
-    uint32_t  second_curr = 0;     // seconds of current time
-
-    Hal_Rtc_Gettime(&rtc_curr);
-    second_curr = time_to_seconds(&rtc_curr);
-
-    uint32_t elaps = second_curr - last_time;
-    uint32_t seconds = elaps % 60;
-    uint32_t minutes = elaps / 60;
-    uint32_t hours = minutes / 60;
-    minutes = minutes % 60;
-
-    if(hours == 0)
-        snprintf(str, size, "%.2d:%.2d", minutes, seconds);
-    else
-        snprintf(str, size, "%.2d:%.2d:%.2d", hours, minutes, seconds);
-}
-
-static lv_obj_t * mmi_vc_ring_off_content_create(lv_obj_t * par)
-{
-    printf("%s %d\n", __FUNCTION__, __LINE__);
-    if(par == NULL) {
-        par = lv_scr_act();
-    }
-
-    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
-    LV_ASSERT_MEM(ext);
-    if(ext == NULL) {
-        return(NULL);
-    }
-
-    lv_obj_t * obj = lv_obj_create(par, NULL);
-    LV_ASSERT_MEM(obj);
-    if(obj == NULL) {
-        return(NULL);
-    }
-    lv_obj_set_size(obj, lv_obj_get_width(par), lv_obj_get_height(par));
-    lv_obj_add_style(obj, LV_OBJ_PART_MAIN, &lv_style_transp_tight);
-
-    lv_obj_t * content = lv_cont_create(obj, NULL);
-    LV_ASSERT_MEM(content);
-    if(content == NULL) {
-        return(NULL);
-    }
-
-    lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_cont_opa1);
-    //lv_obj_set_size(content, 204, 44);
-    //if(ext->vc_ui == MMI_VC_UI_INCOMING || ext->vc_ui == 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);
-    //}
-    lv_obj_set_size(content, LV_HOR_RES - 40, 50);
-       lv_obj_align(content, obj, LV_ALIGN_CENTER, 0, -10);
-    lv_cont_set_layout(content, LV_LAYOUT_CENTER);
-    lv_obj_set_click(content, false);
-
-    lv_obj_t * label = lv_label_create(content, NULL);
-    lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26); // &lv_watch_font20);
-    lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
-
-    if(is_rat_gsm()) 
-       {
-        lv_label_set_text_id(label, WATCH_TEXT_ID_NETWORK_WRONG);
-    } 
-       else 
-       {
-        if(ext->vc_ui == MMI_VC_UI_CONNECTED) 
-               {
-            char tmp[20] = "";
-            char str[30] = "";
-            mmi_vc_get_time_elaps(ext->connect_start_time, tmp, 20);
-            snprintf(str, 30, "%s(%s)", (char *)lv_lang_get_text(WATCH_TEXT_ID_RING_OFF), tmp);
-            lv_label_set_text(label, str);
-        } 
-               else 
-               {
-            lv_label_set_text_id(label, WATCH_TEXT_ID_RING_OFF);
-        }
-    }
-
-    lv_obj_set_click(label, false);
-
-    return(obj);
-}
-
-static void voip_anim_fp_connecting_ring(lv_obj_t * obj, int32_t x)
-{
-    if(obj != NULL) {
-        lv_obj_set_x(obj, x);
-    }
-}
-
-static void mmi_vc_connecting_animation(lv_obj_t * par)
-{
-    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
-
-    LV_ASSERT_MEM(ext);
-    if(ext == NULL) {
-        return;
-    }
-
-    lv_obj_t * img = lv_img_create(mmi_vc_call_get_obj(), NULL);
-    lv_img_set_src(img, LV_SYMBOL_LOOP);
-    lv_obj_add_style(img, LV_OBJ_PART_MAIN, &lv_watch_image);
-    lv_obj_set_style_local_text_font(img, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, LV_THEME_WATCH_NIGHT_SYMBOL_NORMAL);
-    lv_obj_set_y(img, lv_obj_get_y(par) + lv_obj_get_y(lv_obj_get_parent(par)));
-    ext->phone_animation_obj = img;
-
-    /*Create an animation to move the button continuously left to right*/
-    lv_anim_t a;
-    lv_anim_path_t path;
-    lv_anim_value_t start = lv_obj_get_x(par) + lv_obj_get_width(par) + 6;
-    lv_anim_value_t end = start + 30;
-
-    lv_anim_path_init(&path);
-    lv_anim_path_set_cb(&path, lv_anim_path_linear);
-
-    lv_anim_init(&a);
-    lv_anim_set_var(&a, img);
-    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)voip_anim_fp_connecting_ring);
-    lv_anim_set_path(&a, &path);
-    lv_anim_set_values(&a, start, end);
-    lv_anim_set_time(&a, 400);
-    lv_anim_set_playback_time(&a, 400);
-    lv_anim_set_playback_delay(&a, 0);
-    lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
-    lv_anim_set_repeat_delay(&a, 500);
-
-    lv_anim_start(&a);
-}
-
-static void voip_anim_fp_dialing_ring(lv_obj_t * obj, int32_t x)
-{
-    if(obj != NULL) {
-        lv_obj_set_x(obj, x);
-    }
-}
-
-static void mmi_vc_dialing_animation(lv_obj_t * par)
-{
-    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
-
-    LV_ASSERT_MEM(ext);
-    if(ext == NULL) {
-        return;
-    }
-
-    lv_obj_t * img = lv_img_create(mmi_vc_call_get_obj(), NULL);
-    lv_img_set_src(img, LV_SYMBOL_RIGHT);
-    lv_obj_add_style(img, LV_OBJ_PART_MAIN, &lv_watch_image);
-    lv_obj_set_style_local_text_font(img, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, LV_THEME_WATCH_NIGHT_SYMBOL_NORMAL);
-    lv_obj_set_y(img, lv_obj_get_y(par) + lv_obj_get_y(lv_obj_get_parent(par)));
-    ext->phone_animation_obj = img;
-
-    /*Create an animation to move the button continuously left to right*/
-    lv_anim_t a;
-    lv_anim_path_t path;
-    lv_anim_value_t start = lv_obj_get_x(par) + lv_obj_get_width(par) + 6;
-    lv_anim_value_t end = start + 30;
-
-    lv_anim_path_init(&path);
-    lv_anim_path_set_cb(&path, lv_anim_path_linear);
-
-    lv_anim_init(&a);
-    lv_anim_set_var(&a, img);
-    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)voip_anim_fp_dialing_ring);
-    lv_anim_set_path(&a, &path);
-    lv_anim_set_values(&a, start, end);
-    lv_anim_set_time(&a, 400);
-    lv_anim_set_playback_time(&a, 400);
-    lv_anim_set_playback_delay(&a, 0);
-    lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
-    lv_anim_set_repeat_delay(&a, 500);
-
-    lv_anim_start(&a);
-}
-
-static void mmi_vc_ring_animation(lv_obj_t * par)
-{
-    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
-
-    LV_ASSERT_MEM(ext);
-    if(ext == NULL) {
-        return;
-    }
-
-    lv_obj_t * img = lv_img_create(mmi_vc_call_get_obj(), NULL);
-    lv_img_set_src(img, LV_SYMBOL_LEFT);
-    lv_obj_add_style(img, LV_OBJ_PART_MAIN, &lv_watch_image);
-    lv_obj_set_style_local_text_font(img, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, LV_THEME_WATCH_NIGHT_SYMBOL_NORMAL);
-    lv_obj_set_y(img, lv_obj_get_y(par) + lv_obj_get_y(lv_obj_get_parent(par)));
-    ext->phone_animation_obj = img;
-
-    /*Create an animation to move the button continuously left to right*/
-    lv_anim_t a;
-    lv_anim_path_t path;
-    lv_anim_value_t start = lv_obj_get_x(par) - 20;
-    lv_anim_value_t end = start - 30;
-
-    lv_anim_path_init(&path);
-    lv_anim_path_set_cb(&path, lv_anim_path_linear);
-
-    lv_anim_init(&a);
-    lv_anim_set_var(&a, img);
-    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)voip_anim_fp_dialing_ring);
-    lv_anim_set_path(&a, &path);
-    lv_anim_set_values(&a, start, end);
-    lv_anim_set_time(&a, 400);
-    lv_anim_set_playback_time(&a, 400);
-    lv_anim_set_playback_delay(&a, 0);
-    lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
-    lv_anim_set_repeat_delay(&a, 500);
-
-    lv_anim_start(&a);
-}
-
-static void mmi_vc_anim_fp_connected(lv_anim_t * anim)
-{
-    lv_obj_t * obj = (lv_obj_t *)anim->var;
-    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
-
-    LV_ASSERT_MEM(ext);
-    if(ext == NULL) {
-        return;
-    }
-
-    char str[20] = "";
-    mmi_vc_get_time_elaps(ext->connect_start_time, str, 20);
-    if(obj) {
-        lv_label_set_text(obj, str);
-    }
-}
-
-static void mmi_vc_connected_animation(lv_obj_t * obj)
-{
-    lv_anim_t a;
-    lv_anim_path_t path;
-
-    lv_anim_path_init(&path);
-    lv_anim_path_set_cb(&path, lv_anim_path_step);
-
-    lv_anim_init(&a);
-    lv_anim_set_var(&a, obj);
-    lv_anim_set_start_cb(&a, (lv_anim_ready_cb_t)mmi_vc_anim_fp_connected);
-    lv_anim_set_path(&a, &path);
-    lv_anim_set_time(&a, 1);
-    lv_anim_set_playback_time(&a, 0);
-    lv_anim_set_playback_delay(&a, 0);
-    lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
-    lv_anim_set_repeat_delay(&a, 1000);
-
-    lv_anim_start(&a);
-}
-
-void mmi_vc_ring_off_no_carrier(uint8_t isNoCarrier)
-{
-    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_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-        return;
-    }
-
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-    // stop playing tone
-    Hal_Tone_Play_End();
-
-    // stop timer
-    mmi_vc_ring_off_timer_stop();
-       mmi_vc_dialing_timer_stop();
-       mmi_vc_connecting_timer_stop();
-
-    // create ring off UI
-    lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE);
-    if(activity_obj) 
-       {
-        mmi_video_call_phone_ring_off_create();
-    }
-
-    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();
-    }
-    Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
-    watch_wakeup_time_reset();
 
-    Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
-}
-
-static bool mmi_vc_check_mo_permission(void)
-{
-    if((!watch_modem_sim_present_check_req())
-               || (MMI_MODEM_SIGNAL_BAR_0 == watch_modem_get_signal_bar_req())
-//       || (MODEM_VIDEO_CALL_REG_OK != watch_modem_video_call_get_reg_stat_req())
-               || (is_rat_gsm())
-               ) 
-       {
-               return false;
-       }
-       
-    return true;
-}
-
-static void voip_local_remote_switch_action(lv_obj_t * btn, lv_event_t e)
-{
-    if(LV_EVENT_CLICKED != e) {
-        return;
-    }
-
-    printf("%s %d\n", __FUNCTION__, __LINE__);
-    lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE);
-    if(!activity_obj) {
-        return;
-    }
-    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
-    if(!ext) {
-        return;
-    }
-    if(ext->local_remote_switch_flag == VOIP_REMOTE_SWITCH_NULL) {
-        return;
-    }
-    if(ext->local_remote_switch_flag == VOIP_REMOTE_SWITCH_REMOTE) {
-        ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_LOCAL;
-    } else {
-        ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_REMOTE;
-    }
-}
-
-static lv_res_t video_call_element_signal_func(lv_obj_t * element, lv_signal_t sign, void * param)
-{
-    lv_res_t res;
-
-    //printf("%s, sign=%d\n", __FUNCTION__, sign);
-    /* if not click signs, invoke ancient handler and return */
-    if(sign != LV_SIGNAL_PRESSING && sign != LV_SIGNAL_PRESSED && sign != LV_SIGNAL_RELEASED && sign != LV_SIGNAL_PRESS_LOST) {
-        /* Include the ancient signal function */
-        lv_signal_cb_t sign_func = (lv_signal_cb_t)(lv_obj_get_user_data(element).user_data);
-        res = sign_func(element, sign, param);
-        if(res != LV_RES_OK) {
-            return(res);
-        }
-
-        return(LV_RES_OK);
-    }
-
-    lv_obj_t * obj = lv_obj_get_parent(element);
-    while(obj) {
-        if(lv_obj_get_signal_cb(obj) != lv_watch_obj_signal) {
-            obj = lv_obj_get_parent(obj);
-        } else {
-            break;
-        }
-    }
-    if(obj == NULL) {
-        return(LV_RES_INV);
-    }
-
-    res = lv_watch_obj_signal(obj, sign, param);
-    if(res != LV_RES_OK) {
-        return(res);
-    }
-
-    /* Include the ancient signal function */
-    lv_signal_cb_t sign_func = (lv_signal_cb_t)(lv_obj_get_user_data(element).user_data);
-    res = sign_func(element, sign, param);
-    if(res != LV_RES_OK) {
-        return(res);
-    }
-
-    return(LV_RES_OK);
-} /* video_call_element_signal_func */
-
-static void video_call_add_element(lv_obj_t * element)
-{
-    lv_watch_set_free_ptr(element, lv_obj_get_signal_cb(element));
-    lv_obj_set_signal_cb(element, video_call_element_signal_func);
-    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_vc_call_obj_ext_t * ext = mmi_vc_call_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->volume_button, ext->canvas_button_hidden_flag);
-        lv_obj_set_hidden(ext->view_switch_button, true); // 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 = mmi_vc_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_vc_call_obj_ext_t * ext = mmi_vc_call_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;
-    }
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_TONGXIN__
+#include "mmi_video_call_tongxin.c"
 #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_vc_call_obj_ext_t * ext = mmi_vc_call_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);
-        }
-    }
-}
-
-
-
-
-static nv_watch_vc_contact_t s_vc_contact = {0};
-static TIMER_ID fail_timer_id = NULL;
-static MMI_VIDEO_CALL_UI_E s_vc_call_ui = MMI_VC_UI_INVALID;
-
-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_DEBUG][%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);
-
-}
-
-bool mmi_video_call_is_in_call(void)
-{
-       if(MMI_VIDEO_CALL_STATE_NONE == s_video_call_params.state || MMI_VIDEO_CALL_STATE_INVALID == s_video_call_params.state)
-               return false;
-
-       return true;
-}
-
-// 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);
-}
-
-void mmi_vc_ring_off_timer_stop(void)
-{
-       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;
-       }
-}
-
-void mmi_vc_dialing_timer_stop(void)
-{
-       if(NULL != s_video_call_params.dialing_timer_id) 
-       {
-               Hal_Timer_Stop(s_video_call_params.dialing_timer_id);
-               s_video_call_params.dialing_timer_id = NULL;
-       }
-}
-
-void mmi_vc_connecting_timer_stop(void)
-{
-       if(NULL != s_video_call_params.connecting_timer_id) 
-       {
-               Hal_Timer_Stop(s_video_call_params.connecting_timer_id);
-               s_video_call_params.connecting_timer_id = NULL;
-       }
-}
-
-static void mmi_vc_ui_prepare_destory(lv_obj_t * activity_obj)
-{
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-    lv_watch_png_cache_all_free();
-
-    // stop playing tone
-    Hal_Tone_Play_End();
-
-    // ring off
-    mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);
-
-    // stop ring off timer
-    mmi_vc_ring_off_timer_stop();
-
-    // stop callreq timer
-    mmi_vc_dialing_timer_stop();
-
-       //stop
-       mmi_vc_connecting_timer_stop();
-
-    Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
-    s_video_call_params.state = MMI_VIDEO_CALL_STATE_NONE;
-}
-
-static void mmi_vc_hook_action(lv_obj_t * btn, lv_event_t e)
-{
-    if(LV_EVENT_CLICKED != e) 
-       {
-        return;
-    }
-
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-    //if(btn) {
-    //    lv_obj_set_click(btn, false);
-    //}
-
-    Hal_Tone_Play_End();
-
-       mmi_vc_call_action_connecting();
-       
-    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_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
-    if(ext == NULL) 
-       {
-        return(LV_RES_INV);
-    }
-
-    // stop callreq timer
-    mmi_vc_dialing_timer_stop();
-
-    if(ext->vc_ui == MMI_VC_UI_INCOMING || ext->vc_ui == MMI_VC_UI_DIALING) 
-       {
-        if(ext->phone_status_label) {
-            lv_label_set_text(ext->phone_status_label, "");
-        }
-
-        mmi_vc_ring_off_content_create(mmi_vc_call_get_obj());
-    } 
-       else if(ext->vc_ui == MMI_VC_UI_CONNECTED) 
-       {
-        mmi_vc_ring_off_content_create(mmi_vc_call_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, mmi_vc_call_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_DEBUG][%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_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, s_video_call_params.state);
-
-       mmi_vc_dialing_timer_stop();
-    mmi_vc_connecting_timer_stop();
-       
-    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);
-        }
-    }
 
-    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();
-}
-
-void mmi_ui_msg_update_vc_call_stop(void)
-{
-       mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);         
-}
-
-void mmi_vc_call_action_call_stop(void)
-{
-       if(true != mmi_video_call_is_in_call())
-       {
-               return;
-       }
-       
-       mmi_watch_wake_up();
-       mmi_ui_msg_action_vc_call_stop();
-}
-
-static void mmi_vc_ui_dialing(lv_obj_t * content)
-{
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
-    if(ext == NULL) 
-       {
-        return;
-    }
-
-       lv_obj_t * label;
-       uint32_t text_id = WATCH_TEXT_ID_VIDEO_CALL_DAILING;
-       if(MODEM_VIDEO_CALL_TYPE_VIDEO != s_video_call_params.call_type)
-               text_id = WATCH_TEXT_ID_VOICE_CALL_DAILING;
-
-    // label dialing
-    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, text_id);
-    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, 10);
-    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_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
-    if(ext == NULL) 
-       {
-               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-        return;
-    }
-    lv_obj_t * label;
-       uint32_t text_id = WATCH_TEXT_ID_VIDEO_CALL_RINGING;
-       if(MODEM_VIDEO_CALL_TYPE_VIDEO != s_video_call_params.call_type)
-               text_id = WATCH_TEXT_ID_VOICE_CALL_RINGING;
-
-    // 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, text_id);
-    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, 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_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_connecting(lv_obj_t * content)
-{
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-       lv_vc_call_obj_ext_t * ext = mmi_vc_call_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_CONNECTING);
-       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, 10);
-       lv_obj_set_click(label, false);
-
-    // 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_connected(lv_obj_t * content)
-{
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       
-    lv_vc_call_obj_ext_t * ext = mmi_vc_call_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_DEBUG][%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_DEBUG][%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->volume_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->volume_button, ext->canvas_button_hidden_flag);
-                       lv_obj_set_hidden(ext->view_switch_button, true); // 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(mmi_vc_call_get_obj()) {
-            lv_watch_obj_set_down_slide_cb(mmi_vc_call_get_obj(), voip_phone_down_slide_callback);
-        }
-    }
-}
-
-static lv_obj_t * mmi_vc_ui_create(lv_obj_t * activity_obj)
-{
-    if(MMI_VC_UI_CONNECTED == s_vc_call_ui) 
-       {
-        /* set speaker volume to nv when leaving activiry's slider */
-        voip_set_volume_when_slider_act();
-    }
-
-    mmi_vc_call_screen_clean();
-
-    //lv_watch_png_cache_all_free();
-       
-    if(activity_obj == NULL) 
-       {
-        lv_watch_activity_ext_t activity_ext = {0};
-
-        activity_ext.actId           = ACT_ID_VOIPPHONE;
-        activity_ext.create          = NULL; // mmi_vc_ui_create;
-        activity_ext.prepare_destory = mmi_vc_ui_prepare_destory;
-        activity_obj = lv_watch_creat_activity_obj(&activity_ext);
-        if(NULL == activity_obj) 
-               {
-            return NULL;
-        }
-    }
-
-    lv_obj_t * obj = lv_watch_obj_create(activity_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_vc_call_obj_ext_t * ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_vc_call_obj_ext_t));
-    if(ext == NULL) 
-       {
-        return NULL;
-    }
-
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-    ext->phone_status_label       = NULL;
-    ext->phone_animation_obj      = NULL;
-    ext->vc_ui = s_vc_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
-
-    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->volume_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));
-    //lv_cont_set_layout(content, LV_LAYOUT_COLUMN_MID);
-    lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
-       //lv_obj_set_style_local_bg_color(content, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
-       lv_watch_obj_add_element(content);
-    lv_obj_set_click(content, false);
-    lv_obj_align(content, obj, LV_ALIGN_CENTER, 0, 0);
-
-       switch(ext->vc_ui)
-       {
-               case MMI_VC_UI_INCOMING:
-                       mmi_vc_ui_incoming(content);
-                       //mmi_vc_ring_animation(ext->phone_status_label);
-                       break;
-                       
-               case MMI_VC_UI_DIALING:
-                       mmi_vc_ui_dialing(content);
-                       //mmi_vc_dialing_animation(ext->phone_status_label);
-                       break;
-                       
-               case MMI_VC_UI_CONNECTING:
-                       mmi_vc_ui_connecting(content);
-                       //mmi_vc_connecting_animation(ext->phone_status_label);
-                       break;
-                       
-               case MMI_VC_UI_CONNECTED:
-               mmi_vc_ui_connected(content);
-               mmi_vc_connected_animation(ext->phone_status_label);
-                       break;
-
-               default:
-                       break;
-       }
-
-    return obj;
-}
-
-void mmi_ui_msg_update_vc_call_incoming(void)
-{
-       s_vc_call_ui = MMI_VC_UI_INCOMING;
-       mmi_vc_ui_create(NULL);
-}
-
-void mmi_vc_call_action_incoming(char * number, MODEM_VIDEO_CALL_TYPE type)
-{
-       if(true == mmi_active_screen_is_prohibit_interrupted()
-               || true == is_rat_gsm()
-               #ifdef __MMI_ZHSX_SUPPORT_DO_NOT_DISTURB__
-               || true == mmi_watch_is_in_do_not_disturb_time()
-               #endif
-               || true == mmi_video_call_is_in_call()
-               )
-       {
-               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%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, mmi_vc_audio_ctrl_callback))
-    {
-               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__);
-               
-               Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
-               s_video_call_params.call_type = type;
-               s_video_call_params.state = MMI_VIDEO_CALL_STATE_INCOMING;
-               strncpy(s_video_call_params.number, number, NV_WATCH_VC_CONTACT_NUMBER_LEN - 1);
-               uint8_t i = 0;
-               for(i = 0; i < s_vc_contact.total; i++) 
-               {
-                       if(0 == strncmp(s_video_call_params.number, s_vc_contact.number[i], strlen(s_video_call_params.number)))
-                       {
-                               strncpy(s_video_call_params.name, s_vc_contact.name[i], NV_WATCH_VC_CONTACT_NAME_LEN - 1);
-                               break;
-                       }
-               }
-               
-               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);
-
-               mmi_watch_wake_up();
-               
-        voip_rat_check_start();
-               
-               // ui
-               mmi_ui_msg_action_vc_call_incoming();
-    }
-    else
-    { 
-               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__);
-               
-        // auto reject
-        mmi_video_call_reject_req(FALSE);
-        voip_signal_check_stop();
-        voip_rat_check_stop();
-
-        // stop ring off timer
-        mmi_vc_ring_off_timer_stop();
-
-        // stop callreq timer
-        mmi_vc_dialing_timer_stop();
-
-        Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
-        voip_set_volume_when_slider_act();
-        mmi_vc_call_screen_clean();
-        lv_watch_png_cache_all_free();
-        Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
-    }
-}
-
-static void mmi_vc_call_connecting_timeout_cb(void * para)
-{
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-    mmi_vc_connecting_timer_stop();
-    mmi_video_call_hangup_req(TRUE);
-       //mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);
-}
-
-void mmi_vc_call_action_connecting(void)
-{
-       if(MMI_VIDEO_CALL_STATE_CALLING == s_video_call_params.state
-               || MMI_VIDEO_CALL_STATE_CONNECTING == s_video_call_params.state
-               )
-       {
-               return;
-       }
-
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       
-       s_video_call_params.state = MMI_VIDEO_CALL_STATE_CONNECTING;
-
-       // stop timer
-       mmi_vc_dialing_timer_stop();
-    mmi_vc_connecting_timer_stop();
-
-       // stop playing tone
-       Hal_Tone_Play_End();
-
-       //Hal_Set_Voice_Call_Status(VOICE_CALL_START);
-
-       if(NULL == s_video_call_params.connecting_timer_id) 
-       {
-               s_video_call_params.connecting_timer_id = Hal_Timer_Start(MMI_VC_CONNECTING_TIMEOUT, mmi_vc_call_connecting_timeout_cb, NULL, 0);
-       }
-
-       s_vc_call_ui = MMI_VC_UI_CONNECTING;
-       mmi_vc_ui_create(NULL);
-}
-
-void mmi_vc_call_action_connected(void)
-{
-    if(MMI_VIDEO_CALL_STATE_CALLING == s_video_call_params.state)
-       {
-        return;
-    }
-
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       
-    s_video_call_params.state = MMI_VIDEO_CALL_STATE_CALLING;
-
-    // stop timer
-    mmi_vc_dialing_timer_stop();
-       mmi_vc_connecting_timer_stop();
-
-    // stop playing tone
-    Hal_Tone_Play_End();
-
-    Hal_Set_Voice_Call_Status(VOICE_CALL_START);
-
-       s_vc_call_ui = MMI_VC_UI_CONNECTED;
-       mmi_vc_ui_create(NULL);
-}
-
-static void mmi_vc_call_dialing_timeout_cb(void * para)
-{
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-    mmi_vc_dialing_timer_stop();
-    mmi_video_call_hangup_req(TRUE);
-}
-
-void mmi_vc_call_action_dialing(char * number, MODEM_VIDEO_CALL_TYPE type)
-{
-    // check call state
-    if(MMI_VIDEO_CALL_STATE_NONE != s_video_call_params.state)
-       {
-               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, s_video_call_params.state);
-        return;
-    }
-
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__, number, type);
-
-    // stop timer
-    mmi_vc_ring_off_timer_stop();
-    mmi_vc_dialing_timer_stop();
-
-    Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
-    s_video_call_params.state = MMI_VIDEO_CALL_STATE_DIALING;
-    s_video_call_params.call_type = type;
-    strcpy(s_video_call_params.number, number);
-       uint8_t i = 0;
-       for(i = 0; i < s_vc_contact.total; i++) 
-       {
-               if(0 == strncmp(s_video_call_params.number, s_vc_contact.number[i], strlen(s_video_call_params.number)))
-               {
-                       strncpy(s_video_call_params.name, s_vc_contact.name[i], NV_WATCH_VC_CONTACT_NAME_LEN - 1);
-                       break;
-               }
-       }
-       
-    int8_t ret = mmi_video_call_dial_req(type, s_video_call_params.number);
-    if(NULL == s_video_call_params.dialing_timer_id) 
-       {
-               UINT32 timeout = (ret >= 0) ? MMI_VC_DIALING_TIMEOUT : 1*1000;
-               
-        s_video_call_params.dialing_timer_id = Hal_Timer_Start(timeout, mmi_vc_call_dialing_timeout_cb, NULL, 0);
-    }
-
-    voip_rat_check_start();
-
-       s_vc_call_ui = MMI_VC_UI_DIALING;
-       mmi_vc_ui_create(NULL);
-
-    Hal_Audio_Manage_Start_Req(AUDIO_CTRL_PRIORITY_2, mmi_vc_audio_ctrl_callback);
-    Hal_Set_Voice_Call_Status(VOICE_CALL_START);
-}
-
-static void mmi_vc_main_prepare_destory(lv_obj_t * activity_obj)
-{
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       
-    lv_watch_png_cache_all_free();
-
-       if(NULL != fail_timer_id)
-       {
-               Hal_Timer_Stop(fail_timer_id);
-               fail_timer_id = NULL;
-       }
-}
-
-void mmi_vc_call_fail_timeout_cb(void *para)
-{
-       mmi_vc_main_prepare_destory(NULL);
-}
-
-static void mmi_vc_call_action_no_permission(void)
-{
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-    lv_obj_t * obj = lv_watch_get_activity_obj(ACT_ID_VOIP_PHONEBOOK);
-       
-       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));
-       lv_obj_set_style_local_bg_color(cont, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
-       lv_cont_set_layout(cont, LV_LAYOUT_OFF);
-       lv_obj_set_click(cont, false);
-
-       lv_obj_t * label = lv_label_create(cont, NULL);
-       lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
-       lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
-       lv_obj_set_click(label, false);
-       lv_label_set_text_id(label, WATCH_TEXT_ID_DEVICE_NO_NETWORK); // WATCH_TEXT_ID_NO_SIM_OR_NETWORK); // WATCH_TEXT_ID_NO_CONTACTS_OR_NETWORK);
-       lv_obj_align(label, cont, LV_ALIGN_CENTER, 0, 0);
-
-       fail_timer_id = Hal_Timer_Start(2*1000, mmi_vc_call_fail_timeout_cb, NULL, FALSE);
-}
-
-static void mmi_vc_voice_btn_action(lv_obj_t * btn, lv_event_t e)
-{
-    if(LV_EVENT_CLICKED != e)
-       {
-        return;
-    }
-
-       if(true == mmi_video_call_is_in_call())
-       {
-               return;
-       }
-
-    if(true == mmi_vc_check_mo_permission())
-       {
-               uint8_t index = lv_watch_get_free_num(btn);
-
-               mmi_vc_call_action_dialing(s_vc_contact.number[index], MODEM_VIDEO_CALL_TYPE_VOICE);
-    } 
-       else 
-       {
-        mmi_vc_call_action_no_permission();
-    }
-}
-
-static void mmi_vc_video_btn_action(lv_obj_t * btn, lv_event_t e)
-{
-    if(LV_EVENT_CLICKED != e)
-       {
-        return;
-    }
-
-       if(true == mmi_video_call_is_in_call())
-       {
-               return;
-       }
-
-    if(true == mmi_vc_check_mo_permission()) 
-       {
-               uint8_t index = lv_watch_get_free_num(btn);
-
-               mmi_vc_call_action_dialing(s_vc_contact.number[index], MODEM_VIDEO_CALL_TYPE_VIDEO);
-    } 
-       else 
-       {
-        mmi_vc_call_action_no_permission();
-    }
-}
-
-static void mmi_vc_dial_btn_screen(lv_obj_t * btn, lv_event_t e)
-{
-    if(LV_EVENT_CLICKED != e)
-       {
-        return;
-    }
-
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-    lv_obj_t * obj = lv_watch_get_activity_obj(ACT_ID_VOIP_PHONEBOOK);
-       uint8_t index = lv_watch_get_free_num(btn);
-       
-       lv_obj_t * cont = lv_cont_create(obj, NULL);
-       lv_cont_set_fit(cont, LV_FIT_NONE);
-       lv_obj_set_size(cont, LV_HOR_RES, LV_VER_RES); // lv_obj_get_width(obj), lv_obj_get_height(obj));
-       lv_obj_set_style_local_bg_color(cont, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
-       lv_cont_set_layout(cont, LV_LAYOUT_OFF);
-       lv_obj_set_click(cont, false);
-
-       lv_obj_t * voicebtn = lv_imgbtn_create(cont, NULL);
-       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);
-#ifdef USE_LV_WATCH_UI_240_240_CIRCLE
-       lv_obj_align(voicebtn, cont, LV_ALIGN_IN_LEFT_MID, 5, 0);
-#else
-       lv_obj_align(voicebtn, cont, LV_ALIGN_IN_TOP_MID, 0, 10);
-#endif
-       lv_obj_set_event_cb(voicebtn, mmi_vc_voice_btn_action);
-       lv_watch_set_free_num(voicebtn, index);
-       
-       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);
-#ifdef USE_LV_WATCH_UI_240_240_CIRCLE
-       lv_obj_align(videobtn, cont, LV_ALIGN_IN_RIGHT_MID, -5, 0);
-#else
-       lv_obj_align(videobtn, cont, LV_ALIGN_IN_BOTTOM_MID, 0, -10);
-#endif
-       lv_obj_set_event_cb(videobtn, mmi_vc_video_btn_action);
-       lv_watch_set_free_num(videobtn, index);
-}
-
-static lv_obj_t * mmi_vc_contact_list_create(lv_obj_t * obj)
-{
-       /*Allocate the object type specific extended data*/
-       lv_vc_contact_list_obj_ext_t * ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_vc_contact_list_obj_ext_t));
-       /*ext realloc based on watch_obj_ext, do not memeset it*/
-       if(NULL == ext)
-       {
-               return NULL;
-       }
-
-       //ext->title = NULL;
-       ext->list = NULL;
-
-       /* content */
-       lv_obj_t * content = lv_cont_create(obj, NULL);
-       lv_cont_set_fit(content, LV_FIT_NONE);
-       lv_obj_set_size(content, lv_obj_get_width(obj), lv_obj_get_height(obj));
-       lv_obj_add_style(content,LV_OBJ_PART_MAIN, &lv_watch_style_transp);
-       lv_obj_set_style_local_bg_color(content, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
-       lv_cont_set_layout(content, LV_LAYOUT_OFF); // lv_cont_set_layout(content, LV_LAYOUT_COLUMN_MID);
-       lv_obj_set_click(content, false);
-       lv_obj_align(content, obj, LV_ALIGN_CENTER, 0, 0);
-
-       lv_obj_t * label = lv_label_create(content, NULL);
-       lv_obj_set_size(label, LV_HOR_RES, 40); // 30);
-       lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font20_gray);
-       lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
-       lv_label_set_text_id(label, WATCH_TEXT_ID_VIDEOCALL);
-       lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 10);
-       lv_obj_set_click(label, false);
-       //ext->title = label;
-
-       lv_obj_t * list = lv_list_create(content, NULL);
-       if(list == NULL) 
-       {
-               return NULL;
-       }
-    lv_watch_obj_add_element(list);
-       lv_watch_obj_add_element(lv_page_get_scrl(list));
-       lv_obj_add_style(list, LV_LIST_PART_BG, &lv_watch_style_transp);
-       //lv_obj_add_style(list, LV_LIST_PART_SCROLLABLE, &lv_watch_style_transp);
-       //lv_obj_set_style_local_pad_top(list, LV_LIST_PART_SCROLLABLE, LV_STATE_DEFAULT, 4);
-       //lv_obj_set_style_local_pad_bottom(list, LV_LIST_PART_SCROLLABLE, LV_STATE_DEFAULT, 4);
-       lv_list_set_scrollbar_mode(list, LV_SCROLLBAR_MODE_OFF); // lv_page_set_scrollbar_mode(list, LV_SCROLLBAR_MODE_OFF);
-       lv_obj_set_width(list, lv_obj_get_width(content));
-       lv_coord_t height = lv_obj_get_height(content) - 40; // lv_obj_get_height(label);
-       lv_obj_set_height(list, height);
-       lv_obj_align(list, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
-       lv_obj_set_click(list, false);
-       ext->list = list;
-
-       int8_t i = 0;
-       lv_obj_t * btn;
-
-       for(i = 0; i < s_vc_contact.total; i++) 
-       {
-               char t_str[NV_WATCH_VC_CONTACT_NUMBER_LEN] = {0};
-
-               if(0 < strlen(s_vc_contact.name[i]))
-                       strcpy(t_str, s_vc_contact.name[i]);
-               else
-                       strcpy(t_str, s_vc_contact.number[i]);
-                       
-       #if 0
-               btn = lv_list_add_btn(list, NULL, NULL);
-               //lv_page_glue_obj(btn, true);
-               //lv_obj_add_protect(btn, LV_PROTECT_PRESS_LOST);
-               lv_obj_set_event_cb(btn, mmi_vc_dial_btn_screen);
-               lv_watch_obj_add_element(btn);
-               
-               lv_obj_set_style_local_bg_color(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
-               lv_obj_set_style_local_pad_top(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 5);
-               lv_obj_set_style_local_pad_bottom(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 5);
-               lv_obj_set_style_local_pad_left(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 15);
-               lv_obj_set_style_local_pad_right(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 15);
-               lv_obj_set_style_local_pad_inner(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 10);
-               
-               //label = lv_obj_get_child(btn, NULL);
-               //label = lv_list_get_btn_label(btn);
-               label = lv_label_create(btn, NULL);
-        //lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL); // LV_LABEL_LONG_SROLL_CIRC
-               lv_obj_set_width(label, lv_obj_get_width(btn));
-               lv_label_set_text(label, t_str);
-               lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
-               lv_label_set_align(label, LV_LABEL_ALIGN_LEFT);
-        lv_obj_set_click(label, false);
-               //lv_obj_align(label, btn, LV_ALIGN_IN_LEFT_MID, 0, 0);
-               
-               lv_watch_set_free_num(btn, i);
-       #else
-
-               btn = lv_list_add_btn(list, NULL, NULL);
-               lv_btn_set_layout(btn, LV_LAYOUT_ROW_MID);
-               //lv_obj_set_event_cb(btn, mmi_vc_dial_btn_screen);
-               //lv_watch_set_free_num(btn, i);
-               
-               lv_obj_t * cont = lv_cont_create(btn, NULL);
-               lv_cont_set_layout(cont, LV_LAYOUT_OFF);
-               lv_obj_set_width(cont, lv_obj_get_width(btn));
-               lv_obj_set_height(cont, 56); // LV_VER_RES / 4); //lv_obj_get_height(btn));
-               lv_obj_add_style(cont, LV_CONT_PART_MAIN, &lv_style_transp);
-               lv_page_glue_obj(cont, true);
-               lv_watch_obj_add_element(cont);
-               lv_obj_set_click(cont, true);
-               lv_obj_set_event_cb(cont, mmi_vc_dial_btn_screen);
-               lv_watch_set_free_num(cont, i);
-               
-               label = lv_label_create(cont, NULL);
-               lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
-               lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL);
-               lv_obj_set_width(label, lv_obj_get_width(cont) - 40);
-               lv_label_set_text(label, t_str);
-               lv_obj_align(label, cont, LV_ALIGN_IN_LEFT_MID, 20, 0);
-               
-               lv_watch_obj_add_element(btn);
-       #endif
-       }
-
-       return 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_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;
-    }
-
-    lv_obj_t * obj = lv_watch_obj_create(activity_obj);
-    if(NULL == obj)
-        return NULL;
-
-    if(false == mmi_vc_check_mo_permission()) 
-       {
-               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               
-               lv_obj_t * label = lv_label_create(obj, NULL);
-               lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
-               lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
-               lv_obj_set_click(label, false);
-               lv_label_set_text_id(label, WATCH_TEXT_ID_DEVICE_NO_NETWORK); // WATCH_TEXT_ID_NO_SIM_OR_NETWORK); // WATCH_TEXT_ID_NO_CONTACTS_OR_NETWORK);
-               lv_obj_align(label, obj, LV_ALIGN_CENTER, 0, -10);
-    } 
-    else if(true != mmi_watch_tcp_connect_state_get()
-                       || true != mmi_protocol_watch_bind_state_get()
-                       )
-    {
-               // not bind
-               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               
-               lv_obj_t * label = lv_label_create(obj, NULL);
-               lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
-               lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
-               lv_obj_set_click(label, false);
-               lv_label_set_text_id(label, WATCH_TEXT_ID_DEVICE_NOT_BIND);
-               lv_obj_align(label, obj, LV_ALIGN_CENTER, 0, -10);
-    }
-       else if(0 == s_vc_contact.total)
-       {
-               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               
-               lv_obj_t * label = lv_label_create(obj, NULL);
-               lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
-               lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
-               lv_obj_set_click(label, false);
-               lv_label_set_text_id(label, WATCH_TEXT_ID_NO_CONTACTS);
-               lv_obj_align(label, obj, LV_ALIGN_CENTER, 0, -10);
-       }
-       else
-       {
-               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               
-               mmi_vc_contact_list_create(obj);
-    }
-
-    return obj;
-}
-
-void video_call_create_event_cb(lv_obj_t * btn, lv_event_t e)
-{
-#ifdef __VIDEO_CALL_TEST__
-       nv_watch_vc_contact_t t_test_contact = 
-               {
-                       3,
-                       {"test001", "test002", "test003"},
-                       {"jrtc001", "jrtc002", "jrtc003"}
-               };
-
-       _lv_memcpy(&s_vc_contact, &t_test_contact, sizeof(nv_watch_vc_contact_t));
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_WULIAN__
+#include "mmi_video_call_wulian.c"
 #endif
 
-    if(LV_EVENT_CLICKED == e) 
-       {               
-        lv_watch_png_cache_all_free();
-        mmi_vc_main_create(NULL);
-    }
-    else if(LV_EVENT_LONG_PRESSED == e)
-       {
-
-       }
-}
-
-
-//interface
-uint8_t mmi_vc_get_call_volume(void)
-{
-    return(s_video_call_params.speaker_volume);
-}
-
-bool mmi_vc_watch_suspend_check(void)
-{
-    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)
-               || (MMI_VIDEO_CALL_STATE_CONNECTING == s_video_call_params.state)
-               ) 
-    {
-        return false;
-    }
-
-    return true;
-}
-
-bool mmi_vc_connect_check_req(void)
-{
-    if(mmi_vc_call_get_activity_obj()) 
-       {
-        return true;
-    }
-
-       return false;
-}
-
-void mmi_vc_activity_destroy_req(void)
-{
-       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-    lv_obj_t * activity_obj = mmi_vc_call_get_activity_obj();
-    if(NULL == activity_obj) 
-       {
-        return;
-    }
-
-    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(FALSE);
-            break;
-
-        case MMI_VIDEO_CALL_STATE_INCOMING:
-            Hal_Tone_Play_End();
-            mmi_video_call_reject_req(FALSE);
-            break;
-
-        default:
-            mmi_video_call_hangup_req(FALSE);
-            break;
-    }
-
-    voip_signal_check_stop();
-    voip_rat_check_stop();
-
-    // stop timer
-    mmi_vc_ring_off_timer_stop();
-    mmi_vc_dialing_timer_stop();
-    mmi_vc_connecting_timer_stop();
-
-    Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
-    voip_set_volume_when_slider_act();
-    mmi_vc_call_screen_clean();
-    lv_watch_png_cache_all_free();
-}
-
-#endif
 #endif
 
 
index 45c437e..2a48ad5 100644 (file)
@@ -25,7 +25,6 @@ void voip_alarm_ind(void);
 
 
 #ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__
-#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_WULIAN__
 
 
 #define __VIDEO_CALL_DEBUG__
@@ -197,36 +196,17 @@ typedef struct {
 }lv_vc_call_obj_ext_t;
 
 
-/**********************
- * GLOBAL PROTOTYPES
- **********************/
-lv_vc_call_obj_ext_t * mmi_vc_call_get_ext(void);
-
-bool check_voipcall_enter_pm_ind(void);
-void watch_voip_message_handle_init(void);
+#define MMI_WATCH_VC_TICKET_LEN  (64 + 1)
+#define MMI_WATCH_VC_APPKEY_LEN  (24 + 1)
+#define MMI_WATCH_VC_SECRET_LEN  (16 + 1)
+#define MMI_WATCH_VC_TOKENS_LEN  (128 + 1)
+#define MMI_WATCH_VC_UID_LEN  (32 + 1)
 
 
-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_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_dialing(char * number, MODEM_VIDEO_CALL_TYPE type);
-void mmi_vc_call_action_incoming(char * number, MODEM_VIDEO_CALL_TYPE type);
-void mmi_vc_call_action_connecting(void);
-void mmi_vc_call_action_connected(void);
-
-void mmi_ui_msg_update_vc_call_stop(void);
-void mmi_vc_call_action_call_stop(void);
-void mmi_ui_msg_update_vc_call_incoming(void);
-
-int8_t mmi_video_call_dial_req(MODEM_VIDEO_CALL_TYPE calltype, char * pContactUri);
-void mmi_video_call_hangup_req(BOOL bye);
-int8_t mmi_video_call_answer_req(void);
-void mmi_video_call_reject_req(BOOL bye);
-void voip_fps_check(int8_t fps);
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
 
 bool mmi_video_call_is_in_call(void);
 
@@ -238,7 +218,20 @@ bool mmi_vc_watch_suspend_check(void);
 void mmi_vc_activity_destroy_req(void);
 uint8_t mmi_vc_get_call_volume(void);
 
+
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__
+#include "mmi_video_call_fzd.h"
 #endif
+
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_TONGXIN__
+#include "mmi_video_call_tongxin.h"
+#endif
+
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_WULIAN__
+#include "mmi_video_call_wulian.h"
+#endif
+
+
 #endif
 
 
index 054de83..ae6868f 100644 (file)
@@ -4,13 +4,8 @@
 #include "lv_watch.h"
 
 
-#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__
 #ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__
 
-#include "mmi_video_call_fzd.h"
-#include <stdio.h>
-#include <stdlib.h>
-
 
 //static lv_signal_cb_t ancestor_signal;
 #if VIDEO_SIGNAL_CHECK
@@ -2074,6 +2069,5 @@ void mmi_vc_activity_destroy_req(void)
 }
 
 #endif
-#endif
 
 
index 0f8a7c7..e74534b 100644 (file)
@@ -19,189 +19,10 @@ extern "C" {
 #include "../../../lv_ex_conf.h"
 #endif
 
-#if 0
-void voip_alarm_ind(void);
-#endif
-
 
-#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__
 #ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__
 
 
-#define __VIDEO_CALL_DEBUG__
-#ifdef __VIDEO_CALL_DEBUG__
-#define VIDEO_CALL_DEBUG_PRINTF(fmt, ...)      printf("[VIDEO_CALL]"fmt, ##__VA_ARGS__)
-#else
-#define VIDEO_CALL_DEBUG_PRINTF(fmt, ...)
-#endif
-
-//#define __VIDEO_CALL_TEST__
-
-
-
-#define ENABLE_VIDEO_SCALE  1
-
-#define VOIP_PHONE_RING_OFF_ANIMATION_TIME 0
-#define VOIP_PHONE_RING_OFF_CONTINUE_TIME 1500   /*ms*/
-
-#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)))
-#define H263_FMT_QCIF 1
-#if H263_FMT_QCIF == 1
-#define VIDEO_SOURCE_WIDTH   176
-#define VIDEO_SOURCE_HEIGHT  144
-#endif
-
-#if (ENABLE_VIDEO_SCALE==0)
-#define canvas_width  VIDEO_SOURCE_WIDTH
-#define canvas_heigh  VIDEO_SOURCE_HEIGHT
-#else
-#define canvas_width  LV_HOR_RES   /* 240 */
-#define canvas_heigh  LV_VER_RES   /* 240 */
-#endif
-
-#define VIDEO_RENDER_PERIOD  50   /* 1000/50=20fps */
-#define VIDEO_SIGNAL_CHECK  0
-#define VIDEO_SIGNAL_CHECK_PERIOD  1000
-#define VIDEO_RAT_CHECK_PERIOD  200
-#define VIDEO_CALL_FPS_CHECK_LIMIT 5
-
-#define MMI_VC_DIALING_TIMEOUT    (60*1000)
-#define MMI_VC_CONNECTING_TIMEOUT    (30*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)
-
-#elif USE_LV_WATCH_UI_240_240_CIRCLE
-#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
-#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)
-
-#endif
-
-/**********************
- *      TYPEDEFS
- **********************/
-
-/** H.263 picture size format */
-enum voip_h263_fmt {
-    VOIP_H263_FMT_SQCIF = 1, /**<  128 x 96  */
-    VOIP_H263_FMT_QCIF  = 2, /**<  176 x 144  */
-    VOIP_H263_FMT_CIF   = 3, /**<  352 x 288  */
-    VOIP_H263_FMT_4CIF  = 4, /**<  704 x 576  */
-    VOIP_H263_FMT_16CIF = 5, /**< 1408 x 1152 */
-    VOIP_H263_FMT_OTHER = 7,
-};
-
-enum local_remote_switch_e {
-    VOIP_REMOTE_SWITCH_REMOTE = 0,
-    VOIP_REMOTE_SWITCH_LOCAL,
-    VOIP_REMOTE_SWITCH_NULL,
-};
-
-enum enum_canvas_button_hidden_flag
-{
-    NOT_HIDDEN,
-    HIDDEN
-};
-
-
-typedef struct {
-    lv_watch_obj_ext_t lv_watch_obj;
-    /*New data for this type */
-    //lv_obj_t * title;
-    lv_obj_t * list;
-} lv_vc_contact_list_obj_ext_t;
-
-typedef enum 
-{
-    MMI_VC_UI_INCOMING = 0,
-    MMI_VC_UI_DIALING,
-       MMI_VC_UI_CONNECTING,
-    MMI_VC_UI_CONNECTED,
-       MMI_VC_UI_INVALID,
-} 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_CONNECTING,
-       MMI_VIDEO_CALL_STATE_INVALID,
-}MMI_VIDEO_CALL_STATE_E;
-
-
-#define VOIP_RING_OFF_TIMER_LEN    1000
-
-typedef struct {
-    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 */
-    TIMER_ID             ring_off_timer_id;        /* ring off timer */
-    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 call_type;
-    TIMER_ID dialing_timer_id;
-       TIMER_ID connecting_timer_id;
-    uint8_t speaker_volume;           /* speaker volume during call procedure */
-} MMI_VIDEO_CALL_PARAMS_T;
-
-typedef struct {
-    lv_watch_obj_ext_t lv_watch_obj;
-
-       /*New data for this type */
-    lv_obj_t * phone_status_label;
-    lv_obj_t * phone_animation_obj;
-    uint32_t connect_start_time;
-    MMI_VIDEO_CALL_UI_E vc_ui;
-    enum local_remote_switch_e local_remote_switch_flag;
-    enum voip_h263_fmt voiph263fmt;
-    lv_obj_t * connect_time;
-    lv_obj_t * volume_button;
-    lv_obj_t * view_switch_button;
-    lv_obj_t * ring_off_button;
-    enum enum_canvas_button_hidden_flag canvas_button_hidden_flag;
-    lv_obj_t * signal_weak_label;
-    lv_obj_t * canvas;
-}lv_vc_call_obj_ext_t;
-
-
-#define MMI_WATCH_VC_TICKET_LEN  (64 + 1)
-#define MMI_WATCH_VC_TOKENS_LEN  (128 + 1)
-
-
-
 /**********************
  * GLOBAL PROTOTYPES
  **********************/
@@ -233,18 +54,6 @@ int8_t mmi_video_call_answer_req(char * t_ticket);
 void mmi_video_call_reject_req(BOOL bye);
 void voip_fps_check(int8_t fps);
 
-bool mmi_video_call_is_in_call(void);
-
-void video_call_create_event_cb(lv_obj_t *btn, lv_event_t e);
-
-
-bool mmi_vc_connect_check_req(void);
-bool mmi_vc_watch_suspend_check(void);
-void mmi_vc_activity_destroy_req(void);
-uint8_t mmi_vc_get_call_volume(void);
-
-
-#endif
 #endif
 
 
index 2f25af9..e602dbe 100644 (file)
@@ -4,13 +4,8 @@
 #include "lv_watch.h"
 
 
-#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__
 #ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_TONGXIN__
 
-#include "mmi_video_call_tongxin.h"
-#include <stdio.h>
-#include <stdlib.h>
-
 
 //static lv_signal_cb_t ancestor_signal;
 #if VIDEO_SIGNAL_CHECK
@@ -2098,6 +2093,5 @@ void mmi_vc_activity_destroy_req(void)
 }
 
 #endif
-#endif
 
 
index ff37094..48c1240 100644 (file)
@@ -19,192 +19,10 @@ extern "C" {
 #include "../../../lv_ex_conf.h"
 #endif
 
-#if 0
-void voip_alarm_ind(void);
-#endif
-
 
-#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__
 #ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_TONGXIN__
 
 
-#define __VIDEO_CALL_DEBUG__
-#ifdef __VIDEO_CALL_DEBUG__
-#define VIDEO_CALL_DEBUG_PRINTF(fmt, ...)      printf("[VIDEO_CALL]"fmt, ##__VA_ARGS__)
-#else
-#define VIDEO_CALL_DEBUG_PRINTF(fmt, ...)
-#endif
-
-//#define __VIDEO_CALL_TEST__
-
-
-
-#define ENABLE_VIDEO_SCALE  1
-
-#define VOIP_PHONE_RING_OFF_ANIMATION_TIME 0
-#define VOIP_PHONE_RING_OFF_CONTINUE_TIME 1500   /*ms*/
-
-#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)))
-#define H263_FMT_QCIF 1
-#if H263_FMT_QCIF == 1
-#define VIDEO_SOURCE_WIDTH   176
-#define VIDEO_SOURCE_HEIGHT  144
-#endif
-
-#if (ENABLE_VIDEO_SCALE==0)
-#define canvas_width  VIDEO_SOURCE_WIDTH
-#define canvas_heigh  VIDEO_SOURCE_HEIGHT
-#else
-#define canvas_width  LV_HOR_RES   /* 240 */
-#define canvas_heigh  LV_VER_RES   /* 240 */
-#endif
-
-#define VIDEO_RENDER_PERIOD  50   /* 1000/50=20fps */
-#define VIDEO_SIGNAL_CHECK  0
-#define VIDEO_SIGNAL_CHECK_PERIOD  1000
-#define VIDEO_RAT_CHECK_PERIOD  200
-#define VIDEO_CALL_FPS_CHECK_LIMIT 5
-
-#define MMI_VC_DIALING_TIMEOUT    (60*1000)
-#define MMI_VC_CONNECTING_TIMEOUT    (30*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)
-
-#elif USE_LV_WATCH_UI_240_240_CIRCLE
-#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
-#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)
-
-#endif
-
-/**********************
- *      TYPEDEFS
- **********************/
-
-/** H.263 picture size format */
-enum voip_h263_fmt {
-    VOIP_H263_FMT_SQCIF = 1, /**<  128 x 96  */
-    VOIP_H263_FMT_QCIF  = 2, /**<  176 x 144  */
-    VOIP_H263_FMT_CIF   = 3, /**<  352 x 288  */
-    VOIP_H263_FMT_4CIF  = 4, /**<  704 x 576  */
-    VOIP_H263_FMT_16CIF = 5, /**< 1408 x 1152 */
-    VOIP_H263_FMT_OTHER = 7,
-};
-
-enum local_remote_switch_e {
-    VOIP_REMOTE_SWITCH_REMOTE = 0,
-    VOIP_REMOTE_SWITCH_LOCAL,
-    VOIP_REMOTE_SWITCH_NULL,
-};
-
-enum enum_canvas_button_hidden_flag
-{
-    NOT_HIDDEN,
-    HIDDEN
-};
-
-
-typedef struct {
-    lv_watch_obj_ext_t lv_watch_obj;
-    /*New data for this type */
-    //lv_obj_t * title;
-    lv_obj_t * list;
-} lv_vc_contact_list_obj_ext_t;
-
-typedef enum 
-{
-    MMI_VC_UI_INCOMING = 0,
-    MMI_VC_UI_DIALING,
-       MMI_VC_UI_CONNECTING,
-    MMI_VC_UI_CONNECTED,
-       MMI_VC_UI_INVALID,
-} 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_CONNECTING,
-       MMI_VIDEO_CALL_STATE_INVALID,
-}MMI_VIDEO_CALL_STATE_E;
-
-
-#define VOIP_RING_OFF_TIMER_LEN    1000
-
-typedef struct {
-    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 */
-    TIMER_ID             ring_off_timer_id;        /* ring off timer */
-    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 call_type;
-    TIMER_ID dialing_timer_id;
-       TIMER_ID connecting_timer_id;
-    uint8_t speaker_volume;           /* speaker volume during call procedure */
-} MMI_VIDEO_CALL_PARAMS_T;
-
-typedef struct {
-    lv_watch_obj_ext_t lv_watch_obj;
-
-       /*New data for this type */
-    lv_obj_t * phone_status_label;
-    lv_obj_t * phone_animation_obj;
-    uint32_t connect_start_time;
-    MMI_VIDEO_CALL_UI_E vc_ui;
-    enum local_remote_switch_e local_remote_switch_flag;
-    enum voip_h263_fmt voiph263fmt;
-    lv_obj_t * connect_time;
-    lv_obj_t * volume_button;
-    lv_obj_t * view_switch_button;
-    lv_obj_t * ring_off_button;
-    enum enum_canvas_button_hidden_flag canvas_button_hidden_flag;
-    lv_obj_t * signal_weak_label;
-    lv_obj_t * canvas;
-}lv_vc_call_obj_ext_t;
-
-
-#define MMI_WATCH_VC_TICKET_LEN  (64 + 1)
-#define MMI_WATCH_VC_APPKEY_LEN  (24 + 1)
-#define MMI_WATCH_VC_SECRET_LEN  (16 + 1)
-#define MMI_WATCH_VC_TOKENS_LEN  (128 + 1)
-#define MMI_WATCH_VC_UID_LEN  (32 + 1)
-
-
-
 /**********************
  * GLOBAL PROTOTYPES
  **********************/
@@ -238,18 +56,6 @@ int8_t mmi_video_call_answer_req(char * t_ticket);
 void mmi_video_call_reject_req(BOOL bye);
 void voip_fps_check(int8_t fps);
 
-bool mmi_video_call_is_in_call(void);
-
-void video_call_create_event_cb(lv_obj_t *btn, lv_event_t e);
-
-
-bool mmi_vc_connect_check_req(void);
-bool mmi_vc_watch_suspend_check(void);
-void mmi_vc_activity_destroy_req(void);
-uint8_t mmi_vc_get_call_volume(void);
-
-
-#endif
 #endif
 
 
diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_wulian.c b/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_wulian.c
new file mode 100644 (file)
index 0000000..eba6331
--- /dev/null
@@ -0,0 +1,2049 @@
+
+
+
+#include "lv_watch.h"
+
+
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_WULIAN__
+
+
+//static lv_signal_cb_t ancestor_signal;
+#if VIDEO_SIGNAL_CHECK
+static lv_task_t * signal_check_task = NULL;
+#endif
+static lv_task_t * rat_check_task = NULL;
+
+static MMI_VIDEO_CALL_PARAMS_T s_video_call_params;
+lv_color_t g_cbuf[canvas_width * canvas_heigh + 8]  __attribute__((aligned(8)));
+
+/**********************
+*  STATIC PROTOTYPES
+**********************/
+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);
+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_phone_obj_hide_anim_end(lv_anim_t * anim);
+static void voip_anim_fp_dialing_ring(lv_obj_t * obj, int32_t x);
+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 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);
+
+
+void mmi_vc_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, priority);
+       
+    if(AUDIO_CTRL_PRIORITY_2 > priority)
+    {
+        lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE);
+        if(activity_obj == NULL)
+       {
+                       return;
+       }
+        mmi_vc_activity_destroy_req();
+        Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
+    }
+}
+
+void * mmi_video_call_phone_get_video_buffer()
+{
+    return g_cbuf;
+}
+
+/**********************
+*   STATIC FUNCTIONS
+**********************/
+static lv_obj_t * mmi_vc_call_get_activity_obj(void)
+{
+    lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE);
+
+    return(activity_obj);
+}
+
+static lv_obj_t * mmi_vc_call_get_obj(void)
+{
+    lv_obj_t * watch_obj = NULL;
+
+    lv_obj_t * activity_obj = mmi_vc_call_get_activity_obj();
+
+    if(activity_obj) 
+       {
+        lv_watch_get_child_obj(activity_obj, lv_watch_obj_signal, &watch_obj);
+    }
+
+    return(watch_obj);
+}
+
+lv_vc_call_obj_ext_t * mmi_vc_call_get_ext(void)
+{
+    lv_vc_call_obj_ext_t * ext = NULL;
+    lv_obj_t * watch_obj = mmi_vc_call_get_obj();
+
+    if(watch_obj) 
+       {
+        ext = lv_obj_get_ext_attr(watch_obj);
+    }
+
+    return(ext);
+}
+
+static void mmi_vc_call_screen_clean(void)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    lv_obj_t * slider_activit_obj = lv_watch_get_activity_obj(ACT_ID_SLIDER);
+
+    if(slider_activit_obj)
+       {
+        lv_obj_del(slider_activit_obj);
+    }
+
+    lv_obj_t * activity_obj = mmi_vc_call_get_activity_obj();
+    if(activity_obj) 
+       {
+        lv_obj_del(activity_obj);
+    }
+}
+
+static void voip_phone_left_slide_callback(lv_obj_t * obj)
+{
+    printf("%s %d\n", __FUNCTION__, __LINE__);
+        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);
+        }
+}
+
+static void voip_phone_right_slide_callback(lv_obj_t * obj)
+{
+    printf("%s %d\n", __FUNCTION__, __LINE__);
+    mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);
+}
+
+static void voip_phone_down_slide_callback(lv_obj_t * obj)
+{
+    printf("%s %d\n", __FUNCTION__, __LINE__);
+    voip_volume_btn_action(NULL, LV_EVENT_CLICKED);
+}
+
+static void voip_slider_action(lv_obj_t * slider, lv_event_t e)
+{
+    if(e == LV_EVENT_VALUE_CHANGED)
+    {
+        printf("%s %d\n", __FUNCTION__, __LINE__);
+
+        uint8_t v = lv_slider_get_value(slider);
+
+        // set speaker volume
+        if(!Hal_Set_BT_Audio_Path((HAL_SPEAKER_GAIN)v))
+            Hal_Call_Speaker(HAL_CALL_SPK_ON, (HAL_SPEAKER_GAIN)v);
+        s_video_call_params.speaker_volume = v;
+    }
+}
+
+static void voip_volume_btn_action(lv_obj_t * obj, lv_event_t e)
+{
+    if(LV_EVENT_CLICKED != e) {
+        return;
+    }
+
+    printf("%s %d\n", __FUNCTION__, __LINE__);
+    slider_create(NULL, SETTING_VOIP_SPEAKER, 40, voip_slider_action);
+}
+
+static void voip_phone_obj_hide_anim_end(lv_anim_t * anim)
+{
+    (void)anim;
+    printf("%s %d\n", __FUNCTION__, __LINE__);
+
+    mmi_vc_call_screen_clean();
+}
+
+static void mmi_vc_get_time_elaps(uint32_t last_time, char * str, int8_t size)
+{
+    hal_rtc_t rtc_curr;            // current rtc time
+    uint32_t  second_curr = 0;     // seconds of current time
+
+    Hal_Rtc_Gettime(&rtc_curr);
+    second_curr = time_to_seconds(&rtc_curr);
+
+    uint32_t elaps = second_curr - last_time;
+    uint32_t seconds = elaps % 60;
+    uint32_t minutes = elaps / 60;
+    uint32_t hours = minutes / 60;
+    minutes = minutes % 60;
+
+    if(hours == 0)
+        snprintf(str, size, "%.2d:%.2d", minutes, seconds);
+    else
+        snprintf(str, size, "%.2d:%.2d:%.2d", hours, minutes, seconds);
+}
+
+static lv_obj_t * mmi_vc_ring_off_content_create(lv_obj_t * par)
+{
+    printf("%s %d\n", __FUNCTION__, __LINE__);
+    if(par == NULL) {
+        par = lv_scr_act();
+    }
+
+    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+    LV_ASSERT_MEM(ext);
+    if(ext == NULL) {
+        return(NULL);
+    }
+
+    lv_obj_t * obj = lv_obj_create(par, NULL);
+    LV_ASSERT_MEM(obj);
+    if(obj == NULL) {
+        return(NULL);
+    }
+    lv_obj_set_size(obj, lv_obj_get_width(par), lv_obj_get_height(par));
+    lv_obj_add_style(obj, LV_OBJ_PART_MAIN, &lv_style_transp_tight);
+
+    lv_obj_t * content = lv_cont_create(obj, NULL);
+    LV_ASSERT_MEM(content);
+    if(content == NULL) {
+        return(NULL);
+    }
+
+    lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_cont_opa1);
+    //lv_obj_set_size(content, 204, 44);
+    //if(ext->vc_ui == MMI_VC_UI_INCOMING || ext->vc_ui == 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);
+    //}
+    lv_obj_set_size(content, LV_HOR_RES - 40, 50);
+       lv_obj_align(content, obj, LV_ALIGN_CENTER, 0, -10);
+    lv_cont_set_layout(content, LV_LAYOUT_CENTER);
+    lv_obj_set_click(content, false);
+
+    lv_obj_t * label = lv_label_create(content, NULL);
+    lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26); // &lv_watch_font20);
+    lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+
+    if(is_rat_gsm()) 
+       {
+        lv_label_set_text_id(label, WATCH_TEXT_ID_NETWORK_WRONG);
+    } 
+       else 
+       {
+        if(ext->vc_ui == MMI_VC_UI_CONNECTED) 
+               {
+            char tmp[20] = "";
+            char str[30] = "";
+            mmi_vc_get_time_elaps(ext->connect_start_time, tmp, 20);
+            snprintf(str, 30, "%s(%s)", (char *)lv_lang_get_text(WATCH_TEXT_ID_RING_OFF), tmp);
+            lv_label_set_text(label, str);
+        } 
+               else 
+               {
+            lv_label_set_text_id(label, WATCH_TEXT_ID_RING_OFF);
+        }
+    }
+
+    lv_obj_set_click(label, false);
+
+    return(obj);
+}
+
+static void voip_anim_fp_connecting_ring(lv_obj_t * obj, int32_t x)
+{
+    if(obj != NULL) {
+        lv_obj_set_x(obj, x);
+    }
+}
+
+static void mmi_vc_connecting_animation(lv_obj_t * par)
+{
+    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+
+    LV_ASSERT_MEM(ext);
+    if(ext == NULL) {
+        return;
+    }
+
+    lv_obj_t * img = lv_img_create(mmi_vc_call_get_obj(), NULL);
+    lv_img_set_src(img, LV_SYMBOL_LOOP);
+    lv_obj_add_style(img, LV_OBJ_PART_MAIN, &lv_watch_image);
+    lv_obj_set_style_local_text_font(img, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, LV_THEME_WATCH_NIGHT_SYMBOL_NORMAL);
+    lv_obj_set_y(img, lv_obj_get_y(par) + lv_obj_get_y(lv_obj_get_parent(par)));
+    ext->phone_animation_obj = img;
+
+    /*Create an animation to move the button continuously left to right*/
+    lv_anim_t a;
+    lv_anim_path_t path;
+    lv_anim_value_t start = lv_obj_get_x(par) + lv_obj_get_width(par) + 6;
+    lv_anim_value_t end = start + 30;
+
+    lv_anim_path_init(&path);
+    lv_anim_path_set_cb(&path, lv_anim_path_linear);
+
+    lv_anim_init(&a);
+    lv_anim_set_var(&a, img);
+    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)voip_anim_fp_connecting_ring);
+    lv_anim_set_path(&a, &path);
+    lv_anim_set_values(&a, start, end);
+    lv_anim_set_time(&a, 400);
+    lv_anim_set_playback_time(&a, 400);
+    lv_anim_set_playback_delay(&a, 0);
+    lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
+    lv_anim_set_repeat_delay(&a, 500);
+
+    lv_anim_start(&a);
+}
+
+static void voip_anim_fp_dialing_ring(lv_obj_t * obj, int32_t x)
+{
+    if(obj != NULL) {
+        lv_obj_set_x(obj, x);
+    }
+}
+
+static void mmi_vc_dialing_animation(lv_obj_t * par)
+{
+    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+
+    LV_ASSERT_MEM(ext);
+    if(ext == NULL) {
+        return;
+    }
+
+    lv_obj_t * img = lv_img_create(mmi_vc_call_get_obj(), NULL);
+    lv_img_set_src(img, LV_SYMBOL_RIGHT);
+    lv_obj_add_style(img, LV_OBJ_PART_MAIN, &lv_watch_image);
+    lv_obj_set_style_local_text_font(img, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, LV_THEME_WATCH_NIGHT_SYMBOL_NORMAL);
+    lv_obj_set_y(img, lv_obj_get_y(par) + lv_obj_get_y(lv_obj_get_parent(par)));
+    ext->phone_animation_obj = img;
+
+    /*Create an animation to move the button continuously left to right*/
+    lv_anim_t a;
+    lv_anim_path_t path;
+    lv_anim_value_t start = lv_obj_get_x(par) + lv_obj_get_width(par) + 6;
+    lv_anim_value_t end = start + 30;
+
+    lv_anim_path_init(&path);
+    lv_anim_path_set_cb(&path, lv_anim_path_linear);
+
+    lv_anim_init(&a);
+    lv_anim_set_var(&a, img);
+    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)voip_anim_fp_dialing_ring);
+    lv_anim_set_path(&a, &path);
+    lv_anim_set_values(&a, start, end);
+    lv_anim_set_time(&a, 400);
+    lv_anim_set_playback_time(&a, 400);
+    lv_anim_set_playback_delay(&a, 0);
+    lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
+    lv_anim_set_repeat_delay(&a, 500);
+
+    lv_anim_start(&a);
+}
+
+static void mmi_vc_ring_animation(lv_obj_t * par)
+{
+    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+
+    LV_ASSERT_MEM(ext);
+    if(ext == NULL) {
+        return;
+    }
+
+    lv_obj_t * img = lv_img_create(mmi_vc_call_get_obj(), NULL);
+    lv_img_set_src(img, LV_SYMBOL_LEFT);
+    lv_obj_add_style(img, LV_OBJ_PART_MAIN, &lv_watch_image);
+    lv_obj_set_style_local_text_font(img, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, LV_THEME_WATCH_NIGHT_SYMBOL_NORMAL);
+    lv_obj_set_y(img, lv_obj_get_y(par) + lv_obj_get_y(lv_obj_get_parent(par)));
+    ext->phone_animation_obj = img;
+
+    /*Create an animation to move the button continuously left to right*/
+    lv_anim_t a;
+    lv_anim_path_t path;
+    lv_anim_value_t start = lv_obj_get_x(par) - 20;
+    lv_anim_value_t end = start - 30;
+
+    lv_anim_path_init(&path);
+    lv_anim_path_set_cb(&path, lv_anim_path_linear);
+
+    lv_anim_init(&a);
+    lv_anim_set_var(&a, img);
+    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)voip_anim_fp_dialing_ring);
+    lv_anim_set_path(&a, &path);
+    lv_anim_set_values(&a, start, end);
+    lv_anim_set_time(&a, 400);
+    lv_anim_set_playback_time(&a, 400);
+    lv_anim_set_playback_delay(&a, 0);
+    lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
+    lv_anim_set_repeat_delay(&a, 500);
+
+    lv_anim_start(&a);
+}
+
+static void mmi_vc_anim_fp_connected(lv_anim_t * anim)
+{
+    lv_obj_t * obj = (lv_obj_t *)anim->var;
+    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+
+    LV_ASSERT_MEM(ext);
+    if(ext == NULL) {
+        return;
+    }
+
+    char str[20] = "";
+    mmi_vc_get_time_elaps(ext->connect_start_time, str, 20);
+    if(obj) {
+        lv_label_set_text(obj, str);
+    }
+}
+
+static void mmi_vc_connected_animation(lv_obj_t * obj)
+{
+    lv_anim_t a;
+    lv_anim_path_t path;
+
+    lv_anim_path_init(&path);
+    lv_anim_path_set_cb(&path, lv_anim_path_step);
+
+    lv_anim_init(&a);
+    lv_anim_set_var(&a, obj);
+    lv_anim_set_start_cb(&a, (lv_anim_ready_cb_t)mmi_vc_anim_fp_connected);
+    lv_anim_set_path(&a, &path);
+    lv_anim_set_time(&a, 1);
+    lv_anim_set_playback_time(&a, 0);
+    lv_anim_set_playback_delay(&a, 0);
+    lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
+    lv_anim_set_repeat_delay(&a, 1000);
+
+    lv_anim_start(&a);
+}
+
+void mmi_vc_ring_off_no_carrier(uint8_t isNoCarrier)
+{
+    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_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+        return;
+    }
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    // stop playing tone
+    Hal_Tone_Play_End();
+
+    // stop timer
+    mmi_vc_ring_off_timer_stop();
+       mmi_vc_dialing_timer_stop();
+       mmi_vc_connecting_timer_stop();
+
+    // create ring off UI
+    lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE);
+    if(activity_obj) 
+       {
+        mmi_video_call_phone_ring_off_create();
+    }
+
+    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();
+    }
+    Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
+    watch_wakeup_time_reset();
+
+    Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+}
+
+static bool mmi_vc_check_mo_permission(void)
+{
+    if((!watch_modem_sim_present_check_req())
+               || (MMI_MODEM_SIGNAL_BAR_0 == watch_modem_get_signal_bar_req())
+//       || (MODEM_VIDEO_CALL_REG_OK != watch_modem_video_call_get_reg_stat_req())
+               || (is_rat_gsm())
+               ) 
+       {
+               return false;
+       }
+       
+    return true;
+}
+
+static void voip_local_remote_switch_action(lv_obj_t * btn, lv_event_t e)
+{
+    if(LV_EVENT_CLICKED != e) {
+        return;
+    }
+
+    printf("%s %d\n", __FUNCTION__, __LINE__);
+    lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE);
+    if(!activity_obj) {
+        return;
+    }
+    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+    if(!ext) {
+        return;
+    }
+    if(ext->local_remote_switch_flag == VOIP_REMOTE_SWITCH_NULL) {
+        return;
+    }
+    if(ext->local_remote_switch_flag == VOIP_REMOTE_SWITCH_REMOTE) {
+        ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_LOCAL;
+    } else {
+        ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_REMOTE;
+    }
+}
+
+static lv_res_t video_call_element_signal_func(lv_obj_t * element, lv_signal_t sign, void * param)
+{
+    lv_res_t res;
+
+    //printf("%s, sign=%d\n", __FUNCTION__, sign);
+    /* if not click signs, invoke ancient handler and return */
+    if(sign != LV_SIGNAL_PRESSING && sign != LV_SIGNAL_PRESSED && sign != LV_SIGNAL_RELEASED && sign != LV_SIGNAL_PRESS_LOST) {
+        /* Include the ancient signal function */
+        lv_signal_cb_t sign_func = (lv_signal_cb_t)(lv_obj_get_user_data(element).user_data);
+        res = sign_func(element, sign, param);
+        if(res != LV_RES_OK) {
+            return(res);
+        }
+
+        return(LV_RES_OK);
+    }
+
+    lv_obj_t * obj = lv_obj_get_parent(element);
+    while(obj) {
+        if(lv_obj_get_signal_cb(obj) != lv_watch_obj_signal) {
+            obj = lv_obj_get_parent(obj);
+        } else {
+            break;
+        }
+    }
+    if(obj == NULL) {
+        return(LV_RES_INV);
+    }
+
+    res = lv_watch_obj_signal(obj, sign, param);
+    if(res != LV_RES_OK) {
+        return(res);
+    }
+
+    /* Include the ancient signal function */
+    lv_signal_cb_t sign_func = (lv_signal_cb_t)(lv_obj_get_user_data(element).user_data);
+    res = sign_func(element, sign, param);
+    if(res != LV_RES_OK) {
+        return(res);
+    }
+
+    return(LV_RES_OK);
+} /* video_call_element_signal_func */
+
+static void video_call_add_element(lv_obj_t * element)
+{
+    lv_watch_set_free_ptr(element, lv_obj_get_signal_cb(element));
+    lv_obj_set_signal_cb(element, video_call_element_signal_func);
+    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_vc_call_obj_ext_t * ext = mmi_vc_call_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->volume_button, ext->canvas_button_hidden_flag);
+        lv_obj_set_hidden(ext->view_switch_button, true); // 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 = mmi_vc_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_vc_call_obj_ext_t * ext = mmi_vc_call_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_vc_call_obj_ext_t * ext = mmi_vc_call_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);
+        }
+    }
+}
+
+
+
+
+static nv_watch_vc_contact_t s_vc_contact = {0};
+static TIMER_ID fail_timer_id = NULL;
+static MMI_VIDEO_CALL_UI_E s_vc_call_ui = MMI_VC_UI_INVALID;
+
+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_DEBUG][%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);
+
+}
+
+bool mmi_video_call_is_in_call(void)
+{
+       if(MMI_VIDEO_CALL_STATE_NONE == s_video_call_params.state || MMI_VIDEO_CALL_STATE_INVALID == s_video_call_params.state)
+               return false;
+
+       return true;
+}
+
+// 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);
+}
+
+void mmi_vc_ring_off_timer_stop(void)
+{
+       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;
+       }
+}
+
+void mmi_vc_dialing_timer_stop(void)
+{
+       if(NULL != s_video_call_params.dialing_timer_id) 
+       {
+               Hal_Timer_Stop(s_video_call_params.dialing_timer_id);
+               s_video_call_params.dialing_timer_id = NULL;
+       }
+}
+
+void mmi_vc_connecting_timer_stop(void)
+{
+       if(NULL != s_video_call_params.connecting_timer_id) 
+       {
+               Hal_Timer_Stop(s_video_call_params.connecting_timer_id);
+               s_video_call_params.connecting_timer_id = NULL;
+       }
+}
+
+static void mmi_vc_ui_prepare_destory(lv_obj_t * activity_obj)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    lv_watch_png_cache_all_free();
+
+    // stop playing tone
+    Hal_Tone_Play_End();
+
+    // ring off
+    mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);
+
+    // stop ring off timer
+    mmi_vc_ring_off_timer_stop();
+
+    // stop callreq timer
+    mmi_vc_dialing_timer_stop();
+
+       //stop
+       mmi_vc_connecting_timer_stop();
+
+    Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+    s_video_call_params.state = MMI_VIDEO_CALL_STATE_NONE;
+}
+
+static void mmi_vc_hook_action(lv_obj_t * btn, lv_event_t e)
+{
+    if(LV_EVENT_CLICKED != e) 
+       {
+        return;
+    }
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    //if(btn) {
+    //    lv_obj_set_click(btn, false);
+    //}
+
+    Hal_Tone_Play_End();
+
+       mmi_vc_call_action_connecting();
+       
+    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_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+    if(ext == NULL) 
+       {
+        return(LV_RES_INV);
+    }
+
+    // stop callreq timer
+    mmi_vc_dialing_timer_stop();
+
+    if(ext->vc_ui == MMI_VC_UI_INCOMING || ext->vc_ui == MMI_VC_UI_DIALING) 
+       {
+        if(ext->phone_status_label) {
+            lv_label_set_text(ext->phone_status_label, "");
+        }
+
+        mmi_vc_ring_off_content_create(mmi_vc_call_get_obj());
+    } 
+       else if(ext->vc_ui == MMI_VC_UI_CONNECTED) 
+       {
+        mmi_vc_ring_off_content_create(mmi_vc_call_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, mmi_vc_call_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_DEBUG][%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_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, s_video_call_params.state);
+
+       mmi_vc_dialing_timer_stop();
+    mmi_vc_connecting_timer_stop();
+       
+    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);
+        }
+    }
+
+    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();
+}
+
+void mmi_ui_msg_update_vc_call_stop(void)
+{
+       mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);         
+}
+
+void mmi_vc_call_action_call_stop(void)
+{
+       if(true != mmi_video_call_is_in_call())
+       {
+               return;
+       }
+       
+       mmi_watch_wake_up();
+       mmi_ui_msg_action_vc_call_stop();
+}
+
+static void mmi_vc_ui_dialing(lv_obj_t * content)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+    if(ext == NULL) 
+       {
+        return;
+    }
+
+       lv_obj_t * label;
+       uint32_t text_id = WATCH_TEXT_ID_VIDEO_CALL_DAILING;
+       if(MODEM_VIDEO_CALL_TYPE_VIDEO != s_video_call_params.call_type)
+               text_id = WATCH_TEXT_ID_VOICE_CALL_DAILING;
+
+    // label dialing
+    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, text_id);
+    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, 10);
+    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_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+    if(ext == NULL) 
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+        return;
+    }
+    lv_obj_t * label;
+       uint32_t text_id = WATCH_TEXT_ID_VIDEO_CALL_RINGING;
+       if(MODEM_VIDEO_CALL_TYPE_VIDEO != s_video_call_params.call_type)
+               text_id = WATCH_TEXT_ID_VOICE_CALL_RINGING;
+
+    // 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, text_id);
+    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, 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_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_connecting(lv_obj_t * content)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+       lv_vc_call_obj_ext_t * ext = mmi_vc_call_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_CONNECTING);
+       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, 10);
+       lv_obj_set_click(label, false);
+
+    // 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_connected(lv_obj_t * content)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+    lv_vc_call_obj_ext_t * ext = mmi_vc_call_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_DEBUG][%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_DEBUG][%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->volume_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->volume_button, ext->canvas_button_hidden_flag);
+                       lv_obj_set_hidden(ext->view_switch_button, true); // 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(mmi_vc_call_get_obj()) {
+            lv_watch_obj_set_down_slide_cb(mmi_vc_call_get_obj(), voip_phone_down_slide_callback);
+        }
+    }
+}
+
+static lv_obj_t * mmi_vc_ui_create(lv_obj_t * activity_obj)
+{
+    if(MMI_VC_UI_CONNECTED == s_vc_call_ui) 
+       {
+        /* set speaker volume to nv when leaving activiry's slider */
+        voip_set_volume_when_slider_act();
+    }
+
+    mmi_vc_call_screen_clean();
+
+    //lv_watch_png_cache_all_free();
+       
+    if(activity_obj == NULL) 
+       {
+        lv_watch_activity_ext_t activity_ext = {0};
+
+        activity_ext.actId           = ACT_ID_VOIPPHONE;
+        activity_ext.create          = NULL; // mmi_vc_ui_create;
+        activity_ext.prepare_destory = mmi_vc_ui_prepare_destory;
+        activity_obj = lv_watch_creat_activity_obj(&activity_ext);
+        if(NULL == activity_obj) 
+               {
+            return NULL;
+        }
+    }
+
+    lv_obj_t * obj = lv_watch_obj_create(activity_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_vc_call_obj_ext_t * ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_vc_call_obj_ext_t));
+    if(ext == NULL) 
+       {
+        return NULL;
+    }
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    ext->phone_status_label       = NULL;
+    ext->phone_animation_obj      = NULL;
+    ext->vc_ui = s_vc_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
+
+    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->volume_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));
+    //lv_cont_set_layout(content, LV_LAYOUT_COLUMN_MID);
+    lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
+       //lv_obj_set_style_local_bg_color(content, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_watch_obj_add_element(content);
+    lv_obj_set_click(content, false);
+    lv_obj_align(content, obj, LV_ALIGN_CENTER, 0, 0);
+
+       switch(ext->vc_ui)
+       {
+               case MMI_VC_UI_INCOMING:
+                       mmi_vc_ui_incoming(content);
+                       //mmi_vc_ring_animation(ext->phone_status_label);
+                       break;
+                       
+               case MMI_VC_UI_DIALING:
+                       mmi_vc_ui_dialing(content);
+                       //mmi_vc_dialing_animation(ext->phone_status_label);
+                       break;
+                       
+               case MMI_VC_UI_CONNECTING:
+                       mmi_vc_ui_connecting(content);
+                       //mmi_vc_connecting_animation(ext->phone_status_label);
+                       break;
+                       
+               case MMI_VC_UI_CONNECTED:
+               mmi_vc_ui_connected(content);
+               mmi_vc_connected_animation(ext->phone_status_label);
+                       break;
+
+               default:
+                       break;
+       }
+
+    return obj;
+}
+
+void mmi_ui_msg_update_vc_call_incoming(void)
+{
+       s_vc_call_ui = MMI_VC_UI_INCOMING;
+       mmi_vc_ui_create(NULL);
+}
+
+void mmi_vc_call_action_incoming(char * number, MODEM_VIDEO_CALL_TYPE type)
+{
+       if(true == mmi_active_screen_is_prohibit_interrupted()
+               || true == is_rat_gsm()
+               #ifdef __MMI_ZHSX_SUPPORT_DO_NOT_DISTURB__
+               || true == mmi_watch_is_in_do_not_disturb_time()
+               #endif
+               || true == mmi_video_call_is_in_call()
+               )
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%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, mmi_vc_audio_ctrl_callback))
+    {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__);
+               
+               Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+               s_video_call_params.call_type = type;
+               s_video_call_params.state = MMI_VIDEO_CALL_STATE_INCOMING;
+               strncpy(s_video_call_params.number, number, NV_WATCH_VC_CONTACT_NUMBER_LEN - 1);
+               uint8_t i = 0;
+               for(i = 0; i < s_vc_contact.total; i++) 
+               {
+                       if(0 == strncmp(s_video_call_params.number, s_vc_contact.number[i], strlen(s_video_call_params.number)))
+                       {
+                               strncpy(s_video_call_params.name, s_vc_contact.name[i], NV_WATCH_VC_CONTACT_NAME_LEN - 1);
+                               break;
+                       }
+               }
+               
+               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);
+
+               mmi_watch_wake_up();
+               
+        voip_rat_check_start();
+               
+               // ui
+               mmi_ui_msg_action_vc_call_incoming();
+    }
+    else
+    { 
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__);
+               
+        // auto reject
+        mmi_video_call_reject_req(FALSE);
+        voip_signal_check_stop();
+        voip_rat_check_stop();
+
+        // stop ring off timer
+        mmi_vc_ring_off_timer_stop();
+
+        // stop callreq timer
+        mmi_vc_dialing_timer_stop();
+
+        Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+        voip_set_volume_when_slider_act();
+        mmi_vc_call_screen_clean();
+        lv_watch_png_cache_all_free();
+        Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
+    }
+}
+
+static void mmi_vc_call_connecting_timeout_cb(void * para)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    mmi_vc_connecting_timer_stop();
+    mmi_video_call_hangup_req(TRUE);
+       //mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);
+}
+
+void mmi_vc_call_action_connecting(void)
+{
+       if(MMI_VIDEO_CALL_STATE_CALLING == s_video_call_params.state
+               || MMI_VIDEO_CALL_STATE_CONNECTING == s_video_call_params.state
+               )
+       {
+               return;
+       }
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+       s_video_call_params.state = MMI_VIDEO_CALL_STATE_CONNECTING;
+
+       // stop timer
+       mmi_vc_dialing_timer_stop();
+    mmi_vc_connecting_timer_stop();
+
+       // stop playing tone
+       Hal_Tone_Play_End();
+
+       //Hal_Set_Voice_Call_Status(VOICE_CALL_START);
+
+       if(NULL == s_video_call_params.connecting_timer_id) 
+       {
+               s_video_call_params.connecting_timer_id = Hal_Timer_Start(MMI_VC_CONNECTING_TIMEOUT, mmi_vc_call_connecting_timeout_cb, NULL, 0);
+       }
+
+       s_vc_call_ui = MMI_VC_UI_CONNECTING;
+       mmi_vc_ui_create(NULL);
+}
+
+void mmi_vc_call_action_connected(void)
+{
+    if(MMI_VIDEO_CALL_STATE_CALLING == s_video_call_params.state)
+       {
+        return;
+    }
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+    s_video_call_params.state = MMI_VIDEO_CALL_STATE_CALLING;
+
+    // stop timer
+    mmi_vc_dialing_timer_stop();
+       mmi_vc_connecting_timer_stop();
+
+    // stop playing tone
+    Hal_Tone_Play_End();
+
+    Hal_Set_Voice_Call_Status(VOICE_CALL_START);
+
+       s_vc_call_ui = MMI_VC_UI_CONNECTED;
+       mmi_vc_ui_create(NULL);
+}
+
+static void mmi_vc_call_dialing_timeout_cb(void * para)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    mmi_vc_dialing_timer_stop();
+    mmi_video_call_hangup_req(TRUE);
+}
+
+void mmi_vc_call_action_dialing(char * number, MODEM_VIDEO_CALL_TYPE type)
+{
+    // check call state
+    if(MMI_VIDEO_CALL_STATE_NONE != s_video_call_params.state)
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, s_video_call_params.state);
+        return;
+    }
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__, number, type);
+
+    // stop timer
+    mmi_vc_ring_off_timer_stop();
+    mmi_vc_dialing_timer_stop();
+
+    Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+    s_video_call_params.state = MMI_VIDEO_CALL_STATE_DIALING;
+    s_video_call_params.call_type = type;
+    strcpy(s_video_call_params.number, number);
+       uint8_t i = 0;
+       for(i = 0; i < s_vc_contact.total; i++) 
+       {
+               if(0 == strncmp(s_video_call_params.number, s_vc_contact.number[i], strlen(s_video_call_params.number)))
+               {
+                       strncpy(s_video_call_params.name, s_vc_contact.name[i], NV_WATCH_VC_CONTACT_NAME_LEN - 1);
+                       break;
+               }
+       }
+       
+    int8_t ret = mmi_video_call_dial_req(type, s_video_call_params.number);
+    if(NULL == s_video_call_params.dialing_timer_id) 
+       {
+               UINT32 timeout = (ret >= 0) ? MMI_VC_DIALING_TIMEOUT : 1*1000;
+               
+        s_video_call_params.dialing_timer_id = Hal_Timer_Start(timeout, mmi_vc_call_dialing_timeout_cb, NULL, 0);
+    }
+
+    voip_rat_check_start();
+
+       s_vc_call_ui = MMI_VC_UI_DIALING;
+       mmi_vc_ui_create(NULL);
+
+    Hal_Audio_Manage_Start_Req(AUDIO_CTRL_PRIORITY_2, mmi_vc_audio_ctrl_callback);
+    Hal_Set_Voice_Call_Status(VOICE_CALL_START);
+}
+
+static void mmi_vc_main_prepare_destory(lv_obj_t * activity_obj)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+    lv_watch_png_cache_all_free();
+
+       if(NULL != fail_timer_id)
+       {
+               Hal_Timer_Stop(fail_timer_id);
+               fail_timer_id = NULL;
+       }
+}
+
+void mmi_vc_call_fail_timeout_cb(void *para)
+{
+       mmi_vc_main_prepare_destory(NULL);
+}
+
+static void mmi_vc_call_action_no_permission(void)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    lv_obj_t * obj = lv_watch_get_activity_obj(ACT_ID_VOIP_PHONEBOOK);
+       
+       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));
+       lv_obj_set_style_local_bg_color(cont, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_cont_set_layout(cont, LV_LAYOUT_OFF);
+       lv_obj_set_click(cont, false);
+
+       lv_obj_t * label = lv_label_create(cont, NULL);
+       lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+       lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+       lv_obj_set_click(label, false);
+       lv_label_set_text_id(label, WATCH_TEXT_ID_DEVICE_NO_NETWORK); // WATCH_TEXT_ID_NO_SIM_OR_NETWORK); // WATCH_TEXT_ID_NO_CONTACTS_OR_NETWORK);
+       lv_obj_align(label, cont, LV_ALIGN_CENTER, 0, 0);
+
+       fail_timer_id = Hal_Timer_Start(2*1000, mmi_vc_call_fail_timeout_cb, NULL, FALSE);
+}
+
+static void mmi_vc_voice_btn_action(lv_obj_t * btn, lv_event_t e)
+{
+    if(LV_EVENT_CLICKED != e)
+       {
+        return;
+    }
+
+       if(true == mmi_video_call_is_in_call())
+       {
+               return;
+       }
+
+    if(true == mmi_vc_check_mo_permission())
+       {
+               uint8_t index = lv_watch_get_free_num(btn);
+
+               mmi_vc_call_action_dialing(s_vc_contact.number[index], MODEM_VIDEO_CALL_TYPE_VOICE);
+    } 
+       else 
+       {
+        mmi_vc_call_action_no_permission();
+    }
+}
+
+static void mmi_vc_video_btn_action(lv_obj_t * btn, lv_event_t e)
+{
+    if(LV_EVENT_CLICKED != e)
+       {
+        return;
+    }
+
+       if(true == mmi_video_call_is_in_call())
+       {
+               return;
+       }
+
+    if(true == mmi_vc_check_mo_permission()) 
+       {
+               uint8_t index = lv_watch_get_free_num(btn);
+
+               mmi_vc_call_action_dialing(s_vc_contact.number[index], MODEM_VIDEO_CALL_TYPE_VIDEO);
+    } 
+       else 
+       {
+        mmi_vc_call_action_no_permission();
+    }
+}
+
+static void mmi_vc_dial_btn_screen(lv_obj_t * btn, lv_event_t e)
+{
+    if(LV_EVENT_CLICKED != e)
+       {
+        return;
+    }
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    lv_obj_t * obj = lv_watch_get_activity_obj(ACT_ID_VOIP_PHONEBOOK);
+       uint8_t index = lv_watch_get_free_num(btn);
+       
+       lv_obj_t * cont = lv_cont_create(obj, NULL);
+       lv_cont_set_fit(cont, LV_FIT_NONE);
+       lv_obj_set_size(cont, LV_HOR_RES, LV_VER_RES); // lv_obj_get_width(obj), lv_obj_get_height(obj));
+       lv_obj_set_style_local_bg_color(cont, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_cont_set_layout(cont, LV_LAYOUT_OFF);
+       lv_obj_set_click(cont, false);
+
+       lv_obj_t * voicebtn = lv_imgbtn_create(cont, NULL);
+       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);
+#ifdef USE_LV_WATCH_UI_240_240_CIRCLE
+       lv_obj_align(voicebtn, cont, LV_ALIGN_IN_LEFT_MID, 5, 0);
+#else
+       lv_obj_align(voicebtn, cont, LV_ALIGN_IN_TOP_MID, 0, 10);
+#endif
+       lv_obj_set_event_cb(voicebtn, mmi_vc_voice_btn_action);
+       lv_watch_set_free_num(voicebtn, index);
+       
+       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);
+#ifdef USE_LV_WATCH_UI_240_240_CIRCLE
+       lv_obj_align(videobtn, cont, LV_ALIGN_IN_RIGHT_MID, -5, 0);
+#else
+       lv_obj_align(videobtn, cont, LV_ALIGN_IN_BOTTOM_MID, 0, -10);
+#endif
+       lv_obj_set_event_cb(videobtn, mmi_vc_video_btn_action);
+       lv_watch_set_free_num(videobtn, index);
+}
+
+static lv_obj_t * mmi_vc_contact_list_create(lv_obj_t * obj)
+{
+       /*Allocate the object type specific extended data*/
+       lv_vc_contact_list_obj_ext_t * ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_vc_contact_list_obj_ext_t));
+       /*ext realloc based on watch_obj_ext, do not memeset it*/
+       if(NULL == ext)
+       {
+               return NULL;
+       }
+
+       //ext->title = NULL;
+       ext->list = NULL;
+
+       /* content */
+       lv_obj_t * content = lv_cont_create(obj, NULL);
+       lv_cont_set_fit(content, LV_FIT_NONE);
+       lv_obj_set_size(content, lv_obj_get_width(obj), lv_obj_get_height(obj));
+       lv_obj_add_style(content,LV_OBJ_PART_MAIN, &lv_watch_style_transp);
+       lv_obj_set_style_local_bg_color(content, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_cont_set_layout(content, LV_LAYOUT_OFF); // lv_cont_set_layout(content, LV_LAYOUT_COLUMN_MID);
+       lv_obj_set_click(content, false);
+       lv_obj_align(content, obj, LV_ALIGN_CENTER, 0, 0);
+
+       lv_obj_t * label = lv_label_create(content, NULL);
+       lv_obj_set_size(label, LV_HOR_RES, 40); // 30);
+       lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font20_gray);
+       lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+       lv_label_set_text_id(label, WATCH_TEXT_ID_VIDEOCALL);
+       lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 10);
+       lv_obj_set_click(label, false);
+       //ext->title = label;
+
+       lv_obj_t * list = lv_list_create(content, NULL);
+       if(list == NULL) 
+       {
+               return NULL;
+       }
+    lv_watch_obj_add_element(list);
+       lv_watch_obj_add_element(lv_page_get_scrl(list));
+       lv_obj_add_style(list, LV_LIST_PART_BG, &lv_watch_style_transp);
+       //lv_obj_add_style(list, LV_LIST_PART_SCROLLABLE, &lv_watch_style_transp);
+       //lv_obj_set_style_local_pad_top(list, LV_LIST_PART_SCROLLABLE, LV_STATE_DEFAULT, 4);
+       //lv_obj_set_style_local_pad_bottom(list, LV_LIST_PART_SCROLLABLE, LV_STATE_DEFAULT, 4);
+       lv_list_set_scrollbar_mode(list, LV_SCROLLBAR_MODE_OFF); // lv_page_set_scrollbar_mode(list, LV_SCROLLBAR_MODE_OFF);
+       lv_obj_set_width(list, lv_obj_get_width(content));
+       lv_coord_t height = lv_obj_get_height(content) - 40; // lv_obj_get_height(label);
+       lv_obj_set_height(list, height);
+       lv_obj_align(list, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
+       lv_obj_set_click(list, false);
+       ext->list = list;
+
+       int8_t i = 0;
+       lv_obj_t * btn;
+
+       for(i = 0; i < s_vc_contact.total; i++) 
+       {
+               char t_str[NV_WATCH_VC_CONTACT_NUMBER_LEN] = {0};
+
+               if(0 < strlen(s_vc_contact.name[i]))
+                       strcpy(t_str, s_vc_contact.name[i]);
+               else
+                       strcpy(t_str, s_vc_contact.number[i]);
+                       
+       #if 0
+               btn = lv_list_add_btn(list, NULL, NULL);
+               //lv_page_glue_obj(btn, true);
+               //lv_obj_add_protect(btn, LV_PROTECT_PRESS_LOST);
+               lv_obj_set_event_cb(btn, mmi_vc_dial_btn_screen);
+               lv_watch_obj_add_element(btn);
+               
+               lv_obj_set_style_local_bg_color(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+               lv_obj_set_style_local_pad_top(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 5);
+               lv_obj_set_style_local_pad_bottom(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 5);
+               lv_obj_set_style_local_pad_left(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 15);
+               lv_obj_set_style_local_pad_right(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 15);
+               lv_obj_set_style_local_pad_inner(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 10);
+               
+               //label = lv_obj_get_child(btn, NULL);
+               //label = lv_list_get_btn_label(btn);
+               label = lv_label_create(btn, NULL);
+        //lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL); // LV_LABEL_LONG_SROLL_CIRC
+               lv_obj_set_width(label, lv_obj_get_width(btn));
+               lv_label_set_text(label, t_str);
+               lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+               lv_label_set_align(label, LV_LABEL_ALIGN_LEFT);
+        lv_obj_set_click(label, false);
+               //lv_obj_align(label, btn, LV_ALIGN_IN_LEFT_MID, 0, 0);
+               
+               lv_watch_set_free_num(btn, i);
+       #else
+
+               btn = lv_list_add_btn(list, NULL, NULL);
+               lv_btn_set_layout(btn, LV_LAYOUT_ROW_MID);
+               //lv_obj_set_event_cb(btn, mmi_vc_dial_btn_screen);
+               //lv_watch_set_free_num(btn, i);
+               
+               lv_obj_t * cont = lv_cont_create(btn, NULL);
+               lv_cont_set_layout(cont, LV_LAYOUT_OFF);
+               lv_obj_set_width(cont, lv_obj_get_width(btn));
+               lv_obj_set_height(cont, 56); // LV_VER_RES / 4); //lv_obj_get_height(btn));
+               lv_obj_add_style(cont, LV_CONT_PART_MAIN, &lv_style_transp);
+               lv_page_glue_obj(cont, true);
+               lv_watch_obj_add_element(cont);
+               lv_obj_set_click(cont, true);
+               lv_obj_set_event_cb(cont, mmi_vc_dial_btn_screen);
+               lv_watch_set_free_num(cont, i);
+               
+               label = lv_label_create(cont, NULL);
+               lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+               lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL);
+               lv_obj_set_width(label, lv_obj_get_width(cont) - 40);
+               lv_label_set_text(label, t_str);
+               lv_obj_align(label, cont, LV_ALIGN_IN_LEFT_MID, 20, 0);
+               
+               lv_watch_obj_add_element(btn);
+       #endif
+       }
+
+       return 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_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;
+    }
+
+    lv_obj_t * obj = lv_watch_obj_create(activity_obj);
+    if(NULL == obj)
+        return NULL;
+
+    if(false == mmi_vc_check_mo_permission()) 
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               
+               lv_obj_t * label = lv_label_create(obj, NULL);
+               lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+               lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+               lv_obj_set_click(label, false);
+               lv_label_set_text_id(label, WATCH_TEXT_ID_DEVICE_NO_NETWORK); // WATCH_TEXT_ID_NO_SIM_OR_NETWORK); // WATCH_TEXT_ID_NO_CONTACTS_OR_NETWORK);
+               lv_obj_align(label, obj, LV_ALIGN_CENTER, 0, -10);
+    } 
+    else if(true != mmi_watch_tcp_connect_state_get()
+                       || true != mmi_protocol_watch_bind_state_get()
+                       )
+    {
+               // not bind
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               
+               lv_obj_t * label = lv_label_create(obj, NULL);
+               lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+               lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+               lv_obj_set_click(label, false);
+               lv_label_set_text_id(label, WATCH_TEXT_ID_DEVICE_NOT_BIND);
+               lv_obj_align(label, obj, LV_ALIGN_CENTER, 0, -10);
+    }
+       else if(0 == s_vc_contact.total)
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               
+               lv_obj_t * label = lv_label_create(obj, NULL);
+               lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+               lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+               lv_obj_set_click(label, false);
+               lv_label_set_text_id(label, WATCH_TEXT_ID_NO_CONTACTS);
+               lv_obj_align(label, obj, LV_ALIGN_CENTER, 0, -10);
+       }
+       else
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               
+               mmi_vc_contact_list_create(obj);
+    }
+
+    return obj;
+}
+
+void video_call_create_event_cb(lv_obj_t * btn, lv_event_t e)
+{
+#ifdef __VIDEO_CALL_TEST__
+       nv_watch_vc_contact_t t_test_contact = 
+               {
+                       3,
+                       {"test001", "test002", "test003"},
+                       {"jrtc001", "jrtc002", "jrtc003"}
+               };
+
+       _lv_memcpy(&s_vc_contact, &t_test_contact, sizeof(nv_watch_vc_contact_t));
+#endif
+
+    if(LV_EVENT_CLICKED == e) 
+       {               
+        lv_watch_png_cache_all_free();
+        mmi_vc_main_create(NULL);
+    }
+    else if(LV_EVENT_LONG_PRESSED == e)
+       {
+
+       }
+}
+
+
+//interface
+uint8_t mmi_vc_get_call_volume(void)
+{
+    return(s_video_call_params.speaker_volume);
+}
+
+bool mmi_vc_watch_suspend_check(void)
+{
+    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)
+               || (MMI_VIDEO_CALL_STATE_CONNECTING == s_video_call_params.state)
+               ) 
+    {
+        return false;
+    }
+
+    return true;
+}
+
+bool mmi_vc_connect_check_req(void)
+{
+    if(mmi_vc_call_get_activity_obj()) 
+       {
+        return true;
+    }
+
+       return false;
+}
+
+void mmi_vc_activity_destroy_req(void)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    lv_obj_t * activity_obj = mmi_vc_call_get_activity_obj();
+    if(NULL == activity_obj) 
+       {
+        return;
+    }
+
+    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(FALSE);
+            break;
+
+        case MMI_VIDEO_CALL_STATE_INCOMING:
+            Hal_Tone_Play_End();
+            mmi_video_call_reject_req(FALSE);
+            break;
+
+        default:
+            mmi_video_call_hangup_req(FALSE);
+            break;
+    }
+
+    voip_signal_check_stop();
+    voip_rat_check_stop();
+
+    // stop timer
+    mmi_vc_ring_off_timer_stop();
+    mmi_vc_dialing_timer_stop();
+    mmi_vc_connecting_timer_stop();
+
+    Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+    voip_set_volume_when_slider_act();
+    mmi_vc_call_screen_clean();
+    lv_watch_png_cache_all_free();
+}
+
+#endif
+
+
diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_wulian.h b/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_wulian.h
new file mode 100644 (file)
index 0000000..07fb558
--- /dev/null
@@ -0,0 +1,64 @@
+
+
+
+#ifndef __MMI_VIDEO_CALL_WULIAN_H__
+#define __MMI_VIDEO_CALL_WULIAN_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+#ifdef LV_CONF_INCLUDE_SIMPLE
+#include "lvgl.h"
+#include "lv_ex_conf.h"
+#else
+#include "../../../lvgl/lvgl.h"
+#include "../../../lv_ex_conf.h"
+#endif
+
+
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_WULIAN__
+
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+lv_vc_call_obj_ext_t * mmi_vc_call_get_ext(void);
+
+bool check_voipcall_enter_pm_ind(void);
+void watch_voip_message_handle_init(void);
+
+
+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_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_dialing(char * number, MODEM_VIDEO_CALL_TYPE type);
+void mmi_vc_call_action_incoming(char * number, MODEM_VIDEO_CALL_TYPE type);
+void mmi_vc_call_action_connecting(void);
+void mmi_vc_call_action_connected(void);
+
+void mmi_ui_msg_update_vc_call_stop(void);
+void mmi_vc_call_action_call_stop(void);
+void mmi_ui_msg_update_vc_call_incoming(void);
+
+int8_t mmi_video_call_dial_req(MODEM_VIDEO_CALL_TYPE calltype, char * pContactUri);
+void mmi_video_call_hangup_req(BOOL bye);
+int8_t mmi_video_call_answer_req(void);
+void mmi_video_call_reject_req(BOOL bye);
+void voip_fps_check(int8_t fps);
+
+#endif
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*VIDEOCALL_H*/
index 1f4ff62..42ea038 100644 (file)
@@ -176,8 +176,6 @@ extern "C" {
 #include "mmi_sundry/mmi_sundry.h"
 #include "framework/message/mmi_msg_zhsx.h"
 #include "lv_apps/mmi_video_call/mmi_video_call.h"
-#include "lv_apps/mmi_video_call/mmi_video_call_fzd.h"
-#include "lv_apps/mmi_video_call/mmi_video_call_tongxin.h"
 #include "lv_apps/mmi_wechat/wechat.h"
 #include "lv_apps/health_measure/health_measure.h"
 #include "lv_apps/health_measure/health_heart_rate.h"