gengxin
author@CHENG <2393524978@qq.com>
Wed, 15 May 2024 07:10:59 +0000 (15:10 +0800)
committer@CHENG <2393524978@qq.com>
Wed, 15 May 2024 07:10:59 +0000 (15:10 +0800)
2.sdk/project/C55_DS_D11G_DT_HZCH/product/craneg_modem/config/watch/lv_watch_conf_CUSTOM.h
2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_jrtc_client_hzch.c [new file with mode: 0644]
2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_hzch.c [new file with mode: 0644]
2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_hzch.h [new file with mode: 0644]
2.sdk/sdk/gui/lv_watch/mmi_protocol/mmi_protocol_fzd.c
2.sdk/sdk/gui/lv_watch/mmi_protocol/mmi_protocol_fzd.h
2.sdk/sdk/gui/lv_watch/mmi_protocol/mmi_protocol_fzd_content.c

index 2ef2893..5cd98be 100644 (file)
@@ -48,9 +48,9 @@
 #define USE_LV_WATCH_FACTORY_MODE 1
 #define USE_LV_WATCH_VOICE_MSG 0 // 1
 #define USE_LV_WATCH_RESTART_AND_RESET 1
-#define USE_LV_WATCH_CAMERA 1
+#define USE_LV_WATCH_CAMERA 0 // 1
 #define USE_LV_WATCH_SPEECH_RECOG 0 // 1
-#define USE_LV_WATCH_ALBUM 1
+#define USE_LV_WATCH_ALBUM 0 // 1
 #define USE_LV_WATCH_ENGINEER_MODE 1
 #define USE_LV_WATCH_CTA 1
 #define USE_LV_WATCH_VOLTE_SWTICH 0 // 1
 #endif
 
 #define __MMI_ZHSX_SUPPORT_VIDEO_CALL__
-#define __MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__
+#define __MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__
 
 //#define __MMI_WECHAT_SUPPORT__
 //#define __MMI_WECHAT_RECEIVE_AUDIO_USE_MP3__
diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_jrtc_client_hzch.c b/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_jrtc_client_hzch.c
new file mode 100644 (file)
index 0000000..e944476
--- /dev/null
@@ -0,0 +1,570 @@
+
+
+
+#include "lv_watch.h"
+
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__
+
+#if 1
+
+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_tokens)
+{
+#ifndef __VIDEO_CALL_TEST__
+       char appkey[24+1] = "21b649200a62dd8cde334097";
+       char key[16+1] = "41042Jxz17m69E16";
+       char uid[64+1] = {0};
+       char tokens[128+1] = {0};
+       
+       char imei[16] = {0};
+       app_adp_get_imei_req(imei);
+       strncpy(uid, imei, 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_screen();
+               }
+               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, char * t_ticket)
+{
+       char ticket[MMI_WATCH_VC_TICKET_LEN] = {0};
+       memcpy(ticket, t_ticket, MMI_WATCH_VC_TICKET_LEN - 1);
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__, roomid, calltype);
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s\n", __FUNCTION__, __LINE__, ticket);
+
+    if (NULL == roomid || NULL == ticket) 
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: params error\n", __FUNCTION__, __LINE__);
+        mmi_video_call_jrtc_clean_up();
+        return -1;
+    }
+
+    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, NULL);
+    } 
+       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);
+
+    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, char * t_ticket)
+{
+    int8_t ret = -1;
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__, pContactUri, calltype);
+       
+    if (NULL == s_video_call_jrtc.jrtc_ptr)
+       {
+        ret = mmi_video_call_jrtc_open(pContactUri, calltype, t_ticket);
+       }
+       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();
+       
+    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);
+               
+               if(!s_video_call_jrtc.closing)
+               {
+               jrtc_close(s_video_call_jrtc.jrtc_ptr, err);
+               s_video_call_jrtc.closing = 1;
+               }
+    } 
+       else
+       {
+               mmi_vc_ring_off_screen();
+    }
+}
+
+int8_t mmi_video_call_answer_req(char * t_ticket)
+{
+    int8_t ret = -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(), t_ticket);
+       }
+       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();
+
+    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);
+               
+               if(!s_video_call_jrtc.closing) 
+               {
+               jrtc_close(s_video_call_jrtc.jrtc_ptr, err);
+               s_video_call_jrtc.closing = 1;
+               }
+    } 
+       else 
+       {
+               mmi_vc_ring_off_screen();
+    }
+}
+
+
+//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;
+}
+
+
+#else
+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(char * t_appkey, char * t_secret, char * t_tokens, char * t_uid)
+{
+#ifndef __VIDEO_CALL_TEST__
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%s\n", __FUNCTION__, __LINE__, strlen(t_appkey), t_appkey);
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%s\n", __FUNCTION__, __LINE__, strlen(t_uid), t_uid);
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%s\n", __FUNCTION__, __LINE__, strlen(t_secret), t_secret);
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%s\n", __FUNCTION__, __LINE__, strlen(t_tokens), t_tokens);
+       
+       jrtc_config(t_appkey, t_uid, t_secret, t_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_screen();
+               }
+               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(char * t_number, char * t_ticket)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s\n", __FUNCTION__, __LINE__, t_number);
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s\n", __FUNCTION__, __LINE__, t_ticket);
+
+    if (NULL == t_number || NULL == t_ticket) 
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: params error\n", __FUNCTION__, __LINE__);
+        mmi_video_call_jrtc_clean_up();
+        return -1;
+    }
+
+    Hal_Mem_Set(&s_video_call_jrtc, 0, sizeof(MMI_VIDEO_CALL_JRTC_T));
+       
+    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(t_number, t_ticket, &s_video_call_jrtc.rxframe, &s_video_call_jrtc.txframe);
+
+    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);
+
+    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(char * t_number, char * t_ticket)
+{
+    int8_t ret = -1;
+
+    if (NULL == s_video_call_jrtc.jrtc_ptr)
+       {
+        ret = mmi_video_call_jrtc_open(t_number, t_ticket);
+       }
+       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();
+       
+    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);
+               
+               if(!s_video_call_jrtc.closing)
+               {
+               jrtc_close(s_video_call_jrtc.jrtc_ptr, err);
+               s_video_call_jrtc.closing = 1;
+               }
+    } 
+       else
+       {
+               mmi_vc_ring_off_screen();
+    }
+}
+
+
+//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
+
+#endif
+
diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_hzch.c b/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_hzch.c
new file mode 100644 (file)
index 0000000..f64a70f
--- /dev/null
@@ -0,0 +1,3616 @@
+
+
+
+#include "lv_watch.h"
+
+
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__
+
+
+#if 1
+
+//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 = {0};
+lv_color_t g_cbuf[canvas_width * canvas_heigh + 8]  __attribute__((aligned(8)));
+
+static uint8_t s_vc_contact_selected_index = 0;
+
+static char s_video_call_ticket[MMI_WATCH_VC_TICKET_LEN] = {0};
+static char s_video_call_tokens[MMI_WATCH_VC_TOKENS_LEN] = {0};
+
+
+/**********************
+*  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_Vibrator_Play_End();
+               Hal_Tone_Play_End();
+        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_params_clean(void)
+{
+       _lv_memset_00(&s_video_call_params, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+}
+
+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 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_set_style_local_radius(content, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 15);
+    //lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_cont_opa1);
+    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);
+}
+
+static void mmi_vc_ring_off_obj_hide_anim_end(lv_anim_t * anim)
+{
+    (void)anim;
+    printf("%s %d\n", __FUNCTION__, __LINE__);
+
+    mmi_vc_call_screen_clean();
+}
+
+void mmi_vc_ring_off_screen(void)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    // stop playing tone
+    Hal_Tone_Play_End();
+    Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
+
+    // stop timer
+    mmi_vc_all_timer_stop();
+
+       //
+    voip_signal_check_stop();
+    voip_rat_check_stop();
+       
+    // create ring off UI
+    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+    if(NULL != ext) 
+       {
+           //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, "");
+                               lv_obj_set_hidden(ext->phone_status_label, true);
+               }
+           }
+        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)mmi_vc_ring_off_obj_hide_anim_end);
+           lv_anim_set_time(&a, MMI_VC_RING_OFF_ANIM_TIMEOUT);
+           lv_anim_start(&a);
+       }
+
+    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();
+    }
+    watch_wakeup_time_reset();
+
+       mmi_vc_call_params_clean();
+}
+
+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_vc_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;
+}
+
+//
+void mmi_vc_call_operate_send_to_server(void)
+{
+       mmi_protocol_fzd_action_VC_CALL_RESPONSE(s_video_call_params.number, s_video_call_ticket, 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;
+       }
+}
+
+void mmi_vc_all_timer_stop(void)
+{
+       mmi_vc_dialing_timer_stop();
+       mmi_vc_connecting_timer_stop();
+       mmi_vc_ring_off_timer_stop();
+}
+
+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();
+
+    // ring off
+    mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);
+}
+
+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__);
+
+       //
+       Hal_Vibrator_Play_End();
+    Hal_Tone_Play_End();
+    Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
+
+    // stop timer
+    mmi_vc_all_timer_stop();
+
+       mmi_vc_call_action_connecting();
+       
+       //mmi_video_call_jrtc_config_init_01(s_video_call_tokens);
+    int8_t ret = mmi_video_call_answer_req(s_video_call_ticket);
+    if(ret < 0) 
+       {
+        mmi_vc_ring_off_screen();
+    }
+}
+
+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);
+
+    // stop playing tone
+       Hal_Vibrator_Play_End();
+    Hal_Tone_Play_End();
+    Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
+       
+       //
+    voip_signal_check_stop();
+    voip_rat_check_stop();
+       
+    // stop timer
+    mmi_vc_all_timer_stop();
+
+    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_INCOMING:
+            mmi_video_call_reject_req(TRUE);
+            break;
+
+        default:
+            mmi_video_call_hangup_req(TRUE);
+            break;
+       }
+    // watch_wakeup_time_reset();
+    // watch_set_suspend_enable(true, ACT_ID_VOIPPHONE, 0);
+}
+
+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_vc_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);
+    }
+#if USE_LV_WATCH_UI_240_280
+       lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
+#else
+       lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
+#endif
+    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);
+    }
+#if USE_LV_WATCH_UI_240_280
+       lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
+#else
+       lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
+#endif
+    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);
+       }
+#if USE_LV_WATCH_UI_240_280
+       lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
+#else
+       lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
+#endif
+       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);
+
+        //watch_set_suspend_enable(false, ACT_ID_VOIPPHONE, 0);
+    } 
+       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, "00:00");
+            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, "00:00");
+            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)
+{
+#ifdef __MMI_ZHSX_SUPPORT_HEALTH_SENSOR__
+       if(true == mmi_health_measure_state_is_ui_measure())
+       {
+               mmi_health_heart_rate_screen_clean();
+               mmi_health_spo2_screen_clean();
+       #ifdef __MMI_HEALTH_MEASURE_TEMPERATURE_SUPPORT__
+               mmi_health_temperature_screen_clean();
+       #endif
+       }
+#endif
+
+       lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VC_DIAL_BTN);
+       if(NULL != activity_obj)
+       {
+               lv_obj_del(activity_obj);
+       }
+       
+       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, char * t_ticket, char * t_tokens)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    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]: \n", __FUNCTION__, __LINE__);
+               
+               mmi_vc_call_params_clean();
+               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;
+                       }
+               }
+
+               memset(s_video_call_ticket, 0x0, MMI_WATCH_VC_TICKET_LEN);
+               strncpy(s_video_call_ticket, t_ticket, MMI_WATCH_VC_TICKET_LEN - 1);
+               
+               memset(s_video_call_tokens, 0x0, MMI_WATCH_VC_TOKENS_LEN);
+               strncpy(s_video_call_tokens, t_tokens, MMI_WATCH_VC_TOKENS_LEN - 1);
+               
+               // ring
+               uint8_t volume = 0;
+       #ifdef __MMI_USER_PROFILE_SUPPORT__
+               volume = mmi_user_profile_current_mode_remind_volume_get();
+       #else
+               volume = query_current_volume();
+       #endif
+               if(!Hal_Set_BT_Audio_Path(volume))
+               {
+                       Hal_Call_Speaker(HAL_CALL_SPK_ON, volume);
+               }
+        Hal_NFFS_File_Play_Repeat(AUDIO_INCOMING_CALL, volume);
+
+        // vibrate
+               if(true == mmi_watch_vibrate_is_permitted())
+               {
+               Hal_Vibrator_Play_Repeat();
+               }
+
+               //
+               mmi_video_call_jrtc_config_init_01(s_video_call_tokens);
+               
+               mmi_watch_wake_up();
+               
+        voip_rat_check_start();
+               
+               // ui
+               mmi_ui_msg_action_vc_call_incoming();
+    }
+}
+
+bool mmi_vc_call_action_incoming_no_permission(void)
+{
+       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_vc_is_in_call()
+               )
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               
+        return true;
+    }
+               
+    return false;
+}
+
+static void mmi_vc_call_connecting_timeout_cb(void * para)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+       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_all_timer_stop();
+
+       // stop playing tone
+       Hal_Tone_Play_End();
+    Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
+
+       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_all_timer_stop();
+
+    // stop playing tone
+    Hal_Tone_Play_End();
+    Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
+
+    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_ring_off_action(NULL, LV_EVENT_CLICKED);
+}
+
+void mmi_vc_call_action_dialing_ext(char * t_tokens, char * t_ticket)
+{
+       if(MMI_VIDEO_CALL_STATE_DIALING != s_video_call_params.state)
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               return;
+       }
+       
+       memset(s_video_call_ticket, 0x0, MMI_WATCH_VC_TICKET_LEN);
+       strncpy(s_video_call_ticket, t_ticket, MMI_WATCH_VC_TICKET_LEN - 1);
+       
+       memset(s_video_call_tokens, 0x0, MMI_WATCH_VC_TOKENS_LEN);
+       strncpy(s_video_call_tokens, t_tokens, MMI_WATCH_VC_TOKENS_LEN - 1);
+       
+       mmi_video_call_jrtc_config_init_01(s_video_call_tokens);
+       int8_t ret = mmi_video_call_dial_req(s_video_call_params.call_type, s_video_call_params.number, s_video_call_ticket);
+       if(0 > ret)
+       {
+               mmi_vc_call_dialing_timeout_cb(NULL);
+       }
+}
+
+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_all_timer_stop();
+
+       mmi_vc_call_params_clean();
+    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;
+               }
+       }
+       
+       mmi_protocol_fzd_action_VC_CALL_REQUEST(s_video_call_params.number, s_video_call_params.call_type);
+    s_video_call_params.dialing_timer_id = Hal_Timer_Start(MMI_VC_DIALING_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_vc_is_in_call())
+       {
+               return;
+       }
+
+       lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VC_DIAL_BTN);
+       if(NULL != activity_obj)
+       {
+               lv_obj_del(activity_obj);
+       }
+       uint8_t index = s_vc_contact_selected_index;
+       
+    if(true == mmi_vc_check_mo_permission())
+       {
+               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_vc_is_in_call())
+       {
+               return;
+       }
+
+       lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VC_DIAL_BTN);
+       if(NULL != activity_obj)
+       {
+               lv_obj_del(activity_obj);
+       }
+       uint8_t index = s_vc_contact_selected_index;
+       
+    if(true == mmi_vc_check_mo_permission()) 
+       {
+               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_prepare_destory(lv_obj_t * activity_obj)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+    lv_watch_png_cache_all_free();
+}
+
+static lv_obj_t * mmi_vc_dial_btn_screen_create(lv_obj_t * activity_obj)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+    if(activity_obj == NULL) 
+       {
+        lv_watch_activity_ext_t activity_ext = {0};
+
+        activity_ext.actId = ACT_ID_VC_DIAL_BTN;
+        activity_ext.create = mmi_vc_dial_btn_screen_create;
+        activity_ext.prepare_destory = mmi_vc_dial_btn_screen_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;
+
+       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_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_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_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);
+
+    return obj;
+}
+
+static void mmi_vc_contact_event_cb(lv_obj_t * btn, lv_event_t e)
+{
+    if(LV_EVENT_CLICKED != e)
+       {
+        return;
+    }
+
+       if(true == mmi_vc_is_in_call())
+       {
+               return;
+       }
+
+       s_vc_contact_selected_index = lv_watch_get_free_num(btn);
+       mmi_vc_dial_btn_screen_create(NULL);
+}
+
+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_contact_event_cb);
+               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_contact_event_cb);
+               //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_contact_event_cb);
+               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 mmi_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)
+       {
+
+       }
+}
+
+
+
+#else
+//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 = {0};
+lv_color_t g_cbuf[canvas_width * canvas_heigh + 8]  __attribute__((aligned(8)));
+
+static char s_hzch_vc_appkey[MMI_WATCH_VC_APPKEY_LEN] = {0};
+static char s_hzch_vc_secret[MMI_WATCH_VC_SECRET_LEN] = {0};
+static char s_hzch_vc_tokens[MMI_WATCH_VC_TOKENS_LEN] = {0};
+static char s_hzch_vc_number[MMI_WATCH_VC_NUMBER_LEN] = {0};
+static char s_hzch_vc_ticket[MMI_WATCH_VC_TICKET_LEN] = {0};
+static char s_hzch_vc_uid[MMI_WATCH_VC_UID_LEN] = {0};
+
+
+/**********************
+*  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_Vibrator_Play_End();
+               Hal_Tone_Play_End();
+        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_params_clean(void)
+{
+       _lv_memset_00(&s_video_call_params, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+}
+
+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 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_set_style_local_radius(content, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 15);
+    //lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_cont_opa1);
+    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);
+}
+
+static void mmi_vc_ring_off_obj_hide_anim_end(lv_anim_t * anim)
+{
+    (void)anim;
+    printf("%s %d\n", __FUNCTION__, __LINE__);
+
+    mmi_vc_call_screen_clean();
+}
+
+void mmi_vc_ring_off_screen(void)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    // stop playing tone
+    Hal_Tone_Play_End();
+    Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
+
+    // stop timer
+    mmi_vc_all_timer_stop();
+
+       //
+    voip_signal_check_stop();
+    voip_rat_check_stop();
+       
+    // create ring off UI
+    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+    if(NULL != ext) 
+       {
+           //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, "");
+                               lv_obj_set_hidden(ext->phone_status_label, true);
+               }
+           }
+        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)mmi_vc_ring_off_obj_hide_anim_end);
+           lv_anim_set_time(&a, MMI_VC_RING_OFF_ANIM_TIMEOUT);
+           lv_anim_start(&a);
+       }
+
+    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();
+    }
+    watch_wakeup_time_reset();
+
+       mmi_vc_call_params_clean();
+}
+
+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;
+
+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_read(void)
+{
+
+}
+
+bool mmi_vc_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;
+}
+
+//
+void mmi_vc_call_operate_send_to_server(void)
+{
+       mmi_protocol_fzd_action_VC_CALL_CANCEL(s_hzch_vc_number, s_hzch_vc_ticket);
+}
+
+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;
+       }
+}
+
+void mmi_vc_all_timer_stop(void)
+{
+       mmi_vc_dialing_timer_stop();
+       mmi_vc_connecting_timer_stop();
+       mmi_vc_ring_off_timer_stop();
+}
+
+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();
+
+    // ring off
+    mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);
+}
+
+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);
+
+    // stop playing tone
+       Hal_Vibrator_Play_End();
+    Hal_Tone_Play_End();
+    Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
+       
+       //
+    voip_signal_check_stop();
+    voip_rat_check_stop();
+       
+    // stop timer
+    mmi_vc_all_timer_stop();
+
+    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_INCOMING:
+            break;
+
+        default:
+            mmi_video_call_hangup_req(TRUE);
+            break;
+       }
+    // watch_wakeup_time_reset();
+    // watch_set_suspend_enable(true, ACT_ID_VOIPPHONE, 0);
+}
+
+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_vc_is_in_call())
+       {
+               return;
+       }
+       
+       mmi_watch_wake_up();
+       mmi_ui_msg_action_vc_call_stop();
+}
+
+
+void mmi_ui_msg_update_vc_call_referral(void)
+{
+       //mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);       
+}
+
+void mmi_vc_call_action_call_referral(void)
+{
+       if(true != mmi_vc_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;
+    }
+
+       // connecting
+       lv_obj_t * img = lv_img_create(content, NULL);
+       lv_img_set_src(img, ICON_VIDEO_CALL_WAITTING);
+       lv_obj_align(img, NULL, LV_ALIGN_CENTER, 0, 0);
+       lv_obj_set_click(img, false);
+
+       lv_obj_t * btn = lv_btn_create(img, NULL);
+       lv_obj_set_size(btn, 80, 80);
+       //lv_obj_set_style_local_bg_color(btn_cancel, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_MAKE(0x47, 0xA6, 0xFF));
+       //lv_obj_set_style_local_radius(btn_cancel, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 30);
+       //lv_obj_set_style_local_bg_color(btn_cancel, LV_BTN_PART_MAIN, LV_STATE_PRESSED, LV_COLOR_MAKE(0x47, 0xA6, 0xFF));
+       //lv_obj_set_style_local_radius(btn_cancel, LV_BTN_PART_MAIN, LV_STATE_PRESSED, 30);
+       lv_obj_add_style(btn, LV_BTN_PART_MAIN, &lv_style_transp_fit);
+       lv_obj_align(btn, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, -10);
+    lv_obj_set_event_cb(btn, mmi_vc_ring_off_action);
+}
+
+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);
+       }
+#if USE_LV_WATCH_UI_240_280
+       lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
+#else
+       lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
+#endif
+       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);
+
+        //watch_set_suspend_enable(false, ACT_ID_VOIPPHONE, 0);
+    } 
+       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, "00:00");
+            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, "00:00");
+            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_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)
+{
+
+}
+
+static void mmi_vc_call_connecting_timeout_cb(void * para)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+       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_all_timer_stop();
+
+       // stop playing tone
+       Hal_Tone_Play_End();
+    Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
+
+       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_all_timer_stop();
+
+    // stop playing tone
+    Hal_Tone_Play_End();
+    Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
+
+    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_ring_off_action(NULL, LV_EVENT_CLICKED);
+}
+
+void mmi_vc_call_action_dialing_ext(char * t_appkey, char * t_secret, char * t_tokens, char * t_number, char * t_ticket)
+{
+       if(MMI_VIDEO_CALL_STATE_DIALING != s_video_call_params.state)
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               return;
+       }
+       
+       _lv_memset_00(s_hzch_vc_appkey, MMI_WATCH_VC_APPKEY_LEN);
+       strncpy(s_hzch_vc_appkey, t_appkey, MMI_WATCH_VC_APPKEY_LEN - 1);
+       
+       _lv_memset_00(s_hzch_vc_secret, MMI_WATCH_VC_SECRET_LEN);
+       strncpy(s_hzch_vc_secret, t_secret, MMI_WATCH_VC_SECRET_LEN - 1);
+       
+       _lv_memset_00(s_hzch_vc_tokens, MMI_WATCH_VC_TOKENS_LEN);
+       strncpy(s_hzch_vc_tokens, t_tokens, MMI_WATCH_VC_TOKENS_LEN - 1);
+
+       _lv_memset_00(s_hzch_vc_number, MMI_WATCH_VC_NUMBER_LEN);
+       strncpy(s_hzch_vc_number, t_number, MMI_WATCH_VC_NUMBER_LEN - 1);
+       
+       _lv_memset_00(s_hzch_vc_ticket, MMI_WATCH_VC_TICKET_LEN);
+       strncpy(s_hzch_vc_ticket, t_ticket, MMI_WATCH_VC_TICKET_LEN - 1);
+
+       char imei[16] = {0};
+       app_adp_get_imei_req(imei);
+       _lv_memset_00(s_hzch_vc_uid, MMI_WATCH_VC_UID_LEN);
+       strncpy(s_hzch_vc_uid, imei, MMI_WATCH_VC_UID_LEN - 1);
+       
+       mmi_video_call_jrtc_config_init(s_hzch_vc_appkey, s_hzch_vc_secret, s_hzch_vc_tokens, s_hzch_vc_uid);
+       int8_t ret = mmi_video_call_dial_req(s_hzch_vc_number, s_vc_ticket);
+       if(0 > ret)
+       {
+               mmi_vc_call_dialing_timeout_cb(NULL);
+       }
+}
+
+void mmi_vc_call_action_dialing(void)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    // stop timer
+    mmi_vc_all_timer_stop();
+
+       mmi_vc_call_params_clean();
+    s_video_call_params.state = MMI_VIDEO_CALL_STATE_DIALING;
+    s_video_call_params.call_type = MODEM_VIDEO_CALL_TYPE_VIDEO;
+       
+       mmi_protocol_fzd_action_VC_CALL_DIAL();
+    s_video_call_params.dialing_timer_id = Hal_Timer_Start(MMI_VC_DIALING_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_ext_get(void)
+{
+       lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIP_PHONEBOOK);
+       if(NULL == activity_obj) 
+               return NULL;
+
+       lv_obj_t * watch_obj = NULL;
+       lv_watch_get_child_obj(activity_obj, lv_watch_obj_signal, &watch_obj);
+       if(NULL != watch_obj) 
+       {
+               void * ext = lv_obj_get_ext_attr(watch_obj);
+               return ext;
+       }
+
+       return NULL;
+}
+
+static void mmi_vc_call_btn_event_cb(lv_obj_t * btn, lv_event_t e)
+{
+    if(LV_EVENT_CLICKED != e)
+        return;
+
+       lv_hzch_vc_call_obj_ext_t * ext = (lv_hzch_vc_call_obj_ext_t *)mmi_vc_main_ext_get();
+       if(NULL == ext)
+               return ;
+
+       if(false == mmi_vc_check_mo_permission()
+               || true != mmi_watch_tcp_connect_state_get()
+               || true != mmi_protocol_watch_bind_state_get()
+               ) 
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               
+               lv_obj_set_hidden(ext->img_call_cancel, true);
+               lv_obj_set_hidden(ext->button_call, true);
+               lv_obj_set_hidden(ext->button_cancel, true);
+               lv_obj_set_hidden(ext->img_no_signal, false);
+       }
+       else
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+               mmi_vc_call_action_dialing();
+       }       
+}
+
+static void mmi_vc_cancel_btn_event_cb(lv_obj_t * btn, lv_event_t e)
+{
+       if(LV_EVENT_CLICKED != e)
+               return;
+
+       mmi_vc_main_prepare_destory(NULL);
+       lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIP_PHONEBOOK);
+       if(NULL != activity_obj)
+       {
+               lv_obj_del(activity_obj);
+       }
+}
+
+static lv_obj_t * mmi_vc_main_create(lv_obj_t * activity_obj)
+{
+    if(activity_obj == NULL) 
+       {
+        lv_watch_activity_ext_t activity_ext = {0};
+
+        activity_ext.actId = ACT_ID_VOIP_PHONEBOOK;
+        activity_ext.create = mmi_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;
+
+       /*Allocate the object type specific extended data*/
+       lv_hzch_vc_call_obj_ext_t * ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_hzch_vc_call_obj_ext_t));
+       /*ext realloc based on watch_obj_ext, do not memeset it*/
+       if(NULL == ext)
+               return NULL;
+
+       ext->img_call_cancel = NULL;
+       ext->button_call = NULL;
+       ext->button_cancel = NULL;
+       ext->img_no_signal = NULL;
+
+       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 * obj_temp = NULL;
+       // no signal
+       obj_temp = lv_img_create(cont, NULL);
+       lv_img_set_src(obj_temp, ICON_VIDEO_CALL_NO_SIGNAL);
+       lv_obj_align(obj_temp, NULL, LV_ALIGN_CENTER, 0, 0);
+       lv_obj_set_click(obj_temp, false);
+       ext->img_no_signal = obj_temp;
+       lv_obj_set_hidden(ext->img_no_signal, true);
+
+       // default
+       obj_temp = lv_img_create(cont, NULL);
+       lv_img_set_src(obj_temp, ICON_VIDEO_CALL_DEFAULT);
+       lv_obj_align(obj_temp, NULL, LV_ALIGN_CENTER, 0, 0);
+       lv_obj_set_click(obj_temp, false);
+       ext->img_default = obj_temp;
+
+       obj_temp = lv_btn_create(ext->img_default, NULL);
+       lv_obj_set_size(obj_temp, LV_HOR_RES, LV_VER_RES / 2);
+       //lv_obj_set_style_local_bg_color(btn_cancel, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_MAKE(0x47, 0xA6, 0xFF));
+       //lv_obj_set_style_local_radius(btn_cancel, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 30);
+       //lv_obj_set_style_local_bg_color(btn_cancel, LV_BTN_PART_MAIN, LV_STATE_PRESSED, LV_COLOR_MAKE(0x47, 0xA6, 0xFF));
+       //lv_obj_set_style_local_radius(btn_cancel, LV_BTN_PART_MAIN, LV_STATE_PRESSED, 30);
+    lv_obj_add_style(obj_temp, LV_BTN_PART_MAIN, &lv_style_transp_fit);
+       lv_obj_align(obj_temp, NULL, LV_ALIGN_IN_TOP_MID, 0, 0);
+       lv_obj_set_event_cb(obj_temp, mmi_vc_call_btn_event_cb);
+       ext->button_call = obj_temp;
+
+       obj_temp = lv_btn_create(ext->img_default, NULL);
+       lv_obj_set_size(obj_temp, LV_HOR_RES, LV_VER_RES / 2);
+    lv_obj_add_style(obj_temp, LV_BTN_PART_MAIN, &lv_style_transp_fit);
+       lv_obj_align(obj_temp, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
+       lv_obj_set_event_cb(obj_temp, mmi_vc_cancel_btn_event_cb);
+       ext->button_cancel = obj_temp;
+       lv_obj_set_hidden(ext->img_default, false);
+       lv_obj_set_hidden(ext->button_call, false);
+       lv_obj_set_hidden(ext->button_cancel, false);
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    return obj;
+}
+
+void mmi_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)
+       {
+
+       }
+}
+#endif
+
+
+//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;
+    }
+
+    // stop playing tone
+    Hal_Tone_Play_End();
+    Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
+
+    // stop timer
+    mmi_vc_all_timer_stop();
+       
+       //
+    voip_signal_check_stop();
+    voip_rat_check_stop();
+
+    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_INCOMING:
+            break;
+
+        default:
+            mmi_video_call_hangup_req(FALSE);
+            break;
+    }
+
+       mmi_vc_call_params_clean();
+    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_hzch.h b/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_hzch.h
new file mode 100644 (file)
index 0000000..a2f3658
--- /dev/null
@@ -0,0 +1,101 @@
+
+
+
+#ifndef __MMI_VIDEO_CALL_FZD_H__
+#define __MMI_VIDEO_CALL_FZD_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_HZCH__
+
+#if 1
+
+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_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_call_action_dialing(char * number, MODEM_VIDEO_CALL_TYPE type);
+void mmi_vc_call_action_incoming(char * number, MODEM_VIDEO_CALL_TYPE type, char * t_ticket, char * t_tokens);
+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);
+bool mmi_vc_call_action_incoming_no_permission(void);
+
+int8_t mmi_video_call_dial_req(MODEM_VIDEO_CALL_TYPE calltype, char * pContactUri, char * t_ticket);
+void mmi_video_call_hangup_req(BOOL bye);
+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);
+
+
+#else
+typedef struct
+{
+    lv_watch_obj_ext_t lv_watch_obj;
+
+       /*New data for this type */
+       lv_obj_t * img_call_cancel;
+       lv_obj_t * button_call;
+       lv_obj_t * button_cancel;
+       lv_obj_t * img_no_signal;
+}lv_hzch_vc_call_obj_ext_t;
+
+
+
+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(char * t_tokens);
+void mmi_video_call_contact_nv_read(void);
+
+void * mmi_video_call_phone_get_video_buffer(void);
+void mmi_vc_call_action_dialing(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(char * t_number, char * t_ticket);
+void mmi_video_call_hangup_req(BOOL bye);
+void voip_fps_check(int8_t fps);
+#endif
+
+#endif
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*VIDEOCALL_H*/
index 03b5da6..8f8a3cd 100644 (file)
@@ -535,7 +535,7 @@ void mmi_protocol_fzd_receive_data_process(char * recv_str, int recv_len)
 static bool mmi_protocol_fzd_send_without_data(MMI_PROTOCOL_FZD_ACTION_ENUM action)
 {
        bool result = false;
-       unsigned char content_buff = NULL;
+       unsigned char * content_buff = NULL;
        unsigned int content_lenth = 0;
 
        result = mmi_protocol_fzd_send_content_construct(action, content_buff, content_lenth);
@@ -582,6 +582,10 @@ bool mmi_protocol_fzd_parse_LINK(unsigned char * next_buff, unsigned int next_bu
 
        mmi_protocol_fzd_action_get_app_qrcode();
 
+#ifdef MMI_PROJECT_C55_DS_D11G_DT_HZCH
+       mmi_protocol_fzd_action_send_telecom_info_pre();
+#endif
+
        return true;
 }
 
@@ -681,7 +685,9 @@ bool mmi_protocol_fzd_parse_ACTION_BIND(unsigned char * next_buff, unsigned int
 
                        //video call
                #ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__
+               #if 1 // ndef __MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__
                        mmi_protocol_fzd_action_get_vc_config();
+               #endif
                #endif
 
                        // hengai
@@ -2412,7 +2418,7 @@ bool mmi_protocol_fzd_action_VC_CALL_RESPONSE(char * number, uint8_t state)
 }
 #endif
 
-#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__
+#if defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__)
 bool mmi_protocol_fzd_action_get_vc_config(void)
 {
        return mmi_protocol_fzd_send_without_data(MMI_FZD_WATCH_GET_VC_CONFIG);
@@ -2956,6 +2962,115 @@ bool mmi_protocol_fzd_action_VC_CALL_RESPONSE(char * number, char * ticket, MODE
 }
 #endif
 
+#if 0 // def __MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__
+bool mmi_protocol_fzd_action_VC_CALL_DIAL(void);
+{
+       return mmi_protocol_fzd_send_without_data(MMI_FZD_ACTION_VC_CALL_DIAL);
+}
+       
+// [XX*YY*LEN*VC_DIAL,state,appKey,secret,tokens,number,ticket]
+bool mmi_protocol_fzd_parse_VC_CALL_DIAL(unsigned char * next_buff, unsigned int next_buff_len)
+{
+       bool result = false;
+
+       if(NULL == next_buff || 0 == next_buff_len)
+       {
+               PROTOCOL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               return false;
+       }
+
+       result = true;
+
+       char * t_value = NULL;
+       t_value = km_strtok_r(NULL, ",", &next_buff);
+       PROTOCOL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: t_value=%s\n", __FUNCTION__, __LINE__, t_value);
+       if(0 == atoi(t_value))
+       {
+               // stop
+               //mmi_vc_call_action_call_stop();
+       }
+       else
+       {
+               // go on
+               char * t_appkey = NULL;
+               char * t_secret = NULL;
+               char * t_tokens = NULL;
+               char * t_number = NULL;
+               char * t_ticket = NULL;
+               
+               t_appkey = km_strtok_r(NULL, ",", &next_buff);
+               t_secret = km_strtok_r(NULL, ",", &next_buff);
+               t_tokens = km_strtok_r(NULL, ",", &next_buff);
+               t_number = km_strtok_r(NULL, ",", &next_buff);
+               t_ticket = next_buff;
+               
+               mmi_vc_call_action_dialing_ext(t_appkey, t_secret, t_tokens, t_number, t_ticket);
+       }
+       
+       return result;
+}
+
+// [XX*YY*LEN*VC_CANCEL,number,ticket]
+bool mmi_protocol_fzd_action_VC_CALL_CANCEL(char * t_number, char * t_ticket);
+{
+       bool result = false;
+       MMI_PROTOCOL_FZD_ACTION_ENUM action = MMI_FZD_ACTION_VC_CALL_CANCEL;
+       unsigned char content_buff[MMI_WATCH_VC_NUMBER_LEN + MMI_WATCH_VC_TICKET_LEN] = {0};
+       unsigned int content_lenth = 0;
+
+       sprintf(content_buff, ",%s,%d", t_number, t_ticket);
+       content_lenth = strlen(content_buff);
+
+       result = mmi_protocol_fzd_send_with_data(action, content_buff, content_lenth);
+
+       return result;
+}
+
+// [XX*YY*LEN*VC_REFERRAL]
+bool mmi_protocol_fzd_parse_SERVER_VC_CALL_REFERRAL(unsigned char * next_buff, unsigned int next_buff_len)
+{
+       bool result = false;
+       MMI_PROTOCOL_FZD_ACTION_ENUM action = MMI_FZD_SERVER_VC_CALL_REFERRAL;
+
+       result = true;
+       mmi_protocol_fzd_send_without_data(action);
+
+       mmi_vc_call_action_call_referral();
+       
+       return result;
+}
+
+// [XX*YY*LEN*VC_RECOVER]
+bool mmi_protocol_fzd_parse_SERVER_VC_CALL_RECOVER(unsigned char * next_buff, unsigned int next_buff_len)
+{
+       bool result = false;
+       MMI_PROTOCOL_FZD_ACTION_ENUM action = MMI_FZD_SERVER_VC_CALL_RECOVER;
+
+       result = true;
+       mmi_protocol_fzd_send_without_data(action);
+
+       // the other party is reject
+       //mmi_vc_call_action_call_stop();
+       
+       return result;
+}
+
+// [XX*YY*LEN*VC_OFF]
+bool mmi_protocol_fzd_parse_SERVER_VC_CALL_CANCEL(unsigned char * next_buff, unsigned int next_buff_len)
+{
+       bool result = false;
+       MMI_PROTOCOL_FZD_ACTION_ENUM action = MMI_FZD_SERVER_VC_CALL_CANCEL;
+
+       result = true;
+       mmi_protocol_fzd_send_without_data(action);
+
+       // the other party is reject
+       //mmi_vc_call_action_call_stop();
+       
+       return result;
+}
+#endif
+
 #endif
 
 #ifdef __MMI_ZHSX_SUPPORT_DO_NOT_DISTURB__
@@ -3857,32 +3972,106 @@ bool mmi_protocol_fzd_action_hengai_sleep_data_test(char * file_buf, uint32_t fi
 
 #endif
 
-#ifdef __MMI_CUSTOM_HENGAI_TCMS__
-bool mmi_protocol_fzd_action_hengai_tcms_data(char * file_buf, uint32_t file_size)
+#ifdef MMI_PROJECT_C55_DS_D11G_DT_HZCH
+
+#define MMI_CHECK_CELL_ID_INTERVAL     (1000 * 1) // ms
+
+static uint32_t s_protocol_cell_id = 0;
+static void * s_protocol_cell_id_timer_id = NULL;
+
+static void mmi_protocol_check_cell_id_timer_cb(uint32_t para);
+
+static void mmi_protocol_lte_cell_info_ind(app_adp_lte_cells_t * cell_list)
 {
-       bool result = false;
-       MMI_PROTOCOL_FZD_ACTION_ENUM action = MMI_FZD_ACTION_HENGAI_TCMS_DATA;
-       unsigned char * content_buff = NULL;
-       unsigned int content_lenth = 0;
+    s_protocol_cell_id = cell_list->scell.cellid;
+       PROTOCOL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: cell_id=%d\n", __FUNCTION__, __LINE__, s_protocol_cell_id);
+}
 
-#if 0
-       content_buff = (unsigned char *)lv_mem_alloc(file_size + 2);
-       if(NULL == content_buff)
+static void mmi_protocol_gsm_cell_info_ind(app_adp_gsm_cells_t * cell_list)
+{
+    s_protocol_cell_id = cell_list->scell.cell_id;
+       PROTOCOL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: cell_id=%d\n", __FUNCTION__, __LINE__, s_protocol_cell_id);
+}
+
+static void mmi_protocol_check_cell_id_timer_cb(uint32_t para)
+{
+       PROTOCOL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: cell_id=%d\n", __FUNCTION__, __LINE__, s_protocol_cell_id);
+       
+       if(0 == s_protocol_cell_id)
        {
-               PROTOCOL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               return false;
+               uos_timer_stop(s_protocol_cell_id_timer_id);
+               uos_timer_start(s_protocol_cell_id_timer_id, MS_TO_TICKS(MMI_CHECK_CELL_ID_INTERVAL), 0, mmi_protocol_check_cell_id_timer_cb, NULL);
        }
-       _lv_memset_00(content_buff, file_size + 2);
-       sprintf(content_buff, ",");
-       _lv_memcpy(content_buff + 1, file_buf, file_size);
-       content_lenth = file_size;
+       else
+       {
+               if(NULL != s_protocol_cell_id_timer_id)
+               {
+                       uos_timer_stop(s_protocol_cell_id_timer_id);
+                       uos_timer_delete(s_protocol_cell_id_timer_id);
+                       s_protocol_cell_id_timer_id = NULL;
+               }
+
+               mmi_protocol_fzd_action_send_telecom_info();
+       }
+}
+
+bool mmi_protocol_fzd_action_send_telecom_info_pre(void)
+{
+       app_adaptor_lte_cell_info_ind_bind(mmi_protocol_lte_cell_info_ind);
+       app_adaptor_gsm_cell_info_ind_bind(mmi_protocol_gsm_cell_info_ind);
+       app_adaptor_get_cell_info_req(GET_CELL_INFO_ONCE_MODE);
+
+       if(NULL != s_protocol_cell_id_timer_id)
+               uos_timer_stop(s_protocol_cell_id_timer_id);
+       else
+               uos_timer_create(&s_protocol_cell_id_timer_id);
+       
+       uos_timer_start(s_protocol_cell_id_timer_id, MS_TO_TICKS(MMI_CHECK_CELL_ID_INTERVAL), 0, mmi_protocol_check_cell_id_timer_cb, NULL);
+}
+
+bool mmi_protocol_fzd_action_send_telecom_info(void)
+{
+       bool result = false;
+       MMI_PROTOCOL_FZD_ACTION_ENUM action = MMI_FZD_ACTION_SEND_TELECOM_INFO;
+       unsigned char content_buff[512] = {0};
+       unsigned int content_lenth = 0;
+
+       // imei
+    char imei[16 + 1] = {0};
+       app_adp_get_imei_req(imei);
+       strcat(content_buff, ",IMEI:");
+       strcat(content_buff, imei);
+
+       // iccid
+       char * p_iccid = app_adaptor_get_iccid_info_req();
+       strcat(content_buff, ",ICCID:");
+       strcat(content_buff, p_iccid);
+    lv_mem_free(p_iccid);
+
+       // imsi
+       char imsi[16] = {0};
+       app_adp_get_imsi_req(imsi);
+       strcat(content_buff, ",IMSI:");
+       strcat(content_buff, imsi);
+
+       // cellid
+       char cell_id_str[64] = {0};
+       sprintf(cell_id_str, "%d", s_protocol_cell_id);
+       strcat(content_buff, ",CELLID:");
+       strcat(content_buff, cell_id_str);
+
+       // version
+    char version_str[64] = {0};
+       sprintf(version_str, "%s_V1.0_Release", app_adaptor_get_model_id());
+       strcat(content_buff, ",VERSION:");
+       strcat(content_buff, version_str);
        
+       content_lenth = strlen(content_buff);
        result = mmi_protocol_fzd_send_with_data(action, content_buff, content_lenth);
-       lv_mem_free(content_buff);
-#endif
        
        return result;
 }
+
 #endif
 
 #endif
index 52025c4..054cae2 100644 (file)
@@ -144,7 +144,8 @@ typedef enum
        MMI_FZD_ACTION_GET_APP_QRCODE,
 
 #ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__
-#if defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_WULIAN__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_TONGXIN__)
+#if defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_WULIAN__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_TONGXIN__) \
+       || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__)
        MMI_FZD_WATCH_GET_VC_CONFIG,
        MMI_FZD_WATCH_GET_VC_CONTACT,
        MMI_FZD_WATCH_VC_CALL_REQUEST,
@@ -152,6 +153,13 @@ typedef enum
        MMI_FZD_SERVER_VC_CALL_REQUEST,
        MMI_FZD_WATCH_VC_CALL_RESPONSE,
 #endif
+#if 0 // def __MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__
+       MMI_FZD_ACTION_VC_CALL_DIAL,
+       MMI_FZD_ACTION_VC_CALL_CANCEL,
+       MMI_FZD_SERVER_VC_CALL_REFERRAL,
+       MMI_FZD_SERVER_VC_CALL_RECOVER,
+       MMI_FZD_SERVER_VC_CALL_CANCEL,
+#endif
 #endif
 
 #ifdef __MMI_ZHSX_SUPPORT_DO_NOT_DISTURB__
@@ -200,6 +208,9 @@ MMI_FZD_SERVER_SET_GSENSOR_UPLOAD_SWITCH,
 MMI_FZD_SERVER_SET_GSENSOR_DATA,
 MMI_FZD_ACTION_HENGAI_SLEEP_DATA_TEST,
 #endif
+#endif
+#ifdef MMI_PROJECT_C55_DS_D11G_DT_HZCH
+       MMI_FZD_ACTION_SEND_TELECOM_INFO,
 #endif
        MMI_FZD_SERVER_SET_BOOTOFF,
        MMI_FZD_SEND_UP_REMIND,
@@ -316,9 +327,20 @@ bool mmi_protocol_fzd_action_get_app_qrcode(void);
 bool mmi_protocol_fzd_parse_ACTION_GET_APP_QRCODE(unsigned char * next_buff, unsigned int next_buff_len);
 
 #ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__
+#if defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_WULIAN__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_TONGXIN__) \
+       || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__)
 bool mmi_protocol_fzd_action_get_vc_config(void);
 bool mmi_protocol_fzd_action_VC_CALL_REQUEST(char * number, uint8_t call_type);
 #endif
+#if 0 // def __MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__
+bool mmi_protocol_fzd_action_VC_CALL_DIAL(void);
+bool mmi_protocol_fzd_parse_VC_CALL_DIAL(unsigned char * next_buff, unsigned int next_buff_len);
+bool mmi_protocol_fzd_action_VC_CALL_CANCEL(char * t_number, char * t_ticket);
+bool mmi_protocol_fzd_parse_SERVER_VC_CALL_REFERRAL(unsigned char * next_buff, unsigned int next_buff_len);
+bool mmi_protocol_fzd_parse_SERVER_VC_CALL_RECOVER(unsigned char * next_buff, unsigned int next_buff_len);
+bool mmi_protocol_fzd_parse_SERVER_VC_CALL_CANCEL(unsigned char * next_buff, unsigned int next_buff_len);
+#endif
+#endif
 
 #ifdef __MMI_ZHSX_SUPPORT_DO_NOT_DISTURB__
 bool mmi_protocol_fzd_parse_SERVER_SET_NOT_DISTURB(unsigned char * next_buff, unsigned int next_buff_len);
@@ -360,8 +382,10 @@ bool mmi_protocol_fzd_parse_ACTION_HENGAI_ACTIVATION(unsigned char * next_buff,
 bool mmi_protocol_fzd_action_hengai_activation_feedback(void);
 bool mmi_protocol_fzd_action_hengai_sleep_data(char * file_buf, uint32_t file_size);
 #endif
-
-
+#ifdef MMI_PROJECT_C55_DS_D11G_DT_HZCH
+bool mmi_protocol_fzd_action_send_telecom_info(void);
+bool mmi_protocol_fzd_action_send_telecom_info_pre(void);
+#endif
 
 
 #endif
index 16fce3a..365f65c 100644 (file)
@@ -77,7 +77,7 @@ static unsigned char * mmi_protocol_fzd_action_string_get(MMI_PROTOCOL_FZD_ACTIO
                        {MMI_FZD_SERVER_VC_CALL_REQUEST, "jup_hoo_request"},
                        {MMI_FZD_WATCH_VC_CALL_RESPONSE, "jup_hoo_response"},
                #endif
-               #if defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_TONGXIN__)
+               #if defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_TONGXIN__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__)
                        {MMI_FZD_WATCH_GET_VC_CONFIG, "JPREG"},
                        {MMI_FZD_WATCH_GET_VC_CONTACT, "MEMBERS"},
                        {MMI_FZD_WATCH_VC_CALL_REQUEST, "AGTALK"},
@@ -85,6 +85,13 @@ static unsigned char * mmi_protocol_fzd_action_string_get(MMI_PROTOCOL_FZD_ACTIO
                        {MMI_FZD_SERVER_VC_CALL_REQUEST, "CALLING"},
                        {MMI_FZD_WATCH_VC_CALL_RESPONSE, "RCALLING"},
                #endif
+               #if 0 // def __MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__
+                       {MMI_FZD_ACTION_VC_CALL_DIAL, "VC_DIAL"},
+                       {MMI_FZD_ACTION_VC_CALL_CANCEL, "VC_CANCEL"},
+                       {MMI_FZD_SERVER_VC_CALL_REFERRAL, "VC_REFERRAL"},
+                       {MMI_FZD_SERVER_VC_CALL_RECOVER, "VC_RECOVER"},
+                       {MMI_FZD_SERVER_VC_CALL_CANCEL, "VC_OFF"},
+               #endif
                #endif
                #ifdef __MMI_ZHSX_SUPPORT_DO_NOT_DISTURB__
                        {MMI_FZD_SERVER_SET_NOT_DISTURB, "SILENCETIME2"},
@@ -134,8 +141,8 @@ static unsigned char * mmi_protocol_fzd_action_string_get(MMI_PROTOCOL_FZD_ACTIO
                        {MMI_FZD_ACTION_HENGAI_SLEEP_DATA_TEST, "TEST_SLEEP_DATA"},                     
                        #endif
                #endif
-               #ifdef __MMI_CUSTOM_HENGAI_TCMS__
-                       {MMI_FZD_ACTION_HENGAI_TCMS_DATA, "CNDOCD"},                    
+               #ifdef MMI_PROJECT_C55_DS_D11G_DT_HZCH
+                       {MMI_FZD_ACTION_SEND_TELECOM_INFO, "TELECOM_INFO"},
                #endif
                        {MMI_FZD_SERVER_SET_BOOTOFF, "BOOTOFF"},
                        {MMI_FZD_SEND_UP_REMIND, "UP_REMIND"},
@@ -331,7 +338,8 @@ static bool mmi_protocol_fzd_content_parse(unsigned char * content_ptr, unsigned
                        break;
 
        #ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__
-       #if defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_WULIAN__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_TONGXIN__)
+       #if defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_WULIAN__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_TONGXIN__) \
+               || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__)
                case MMI_FZD_WATCH_GET_VC_CONFIG:
                        mmi_protocol_fzd_parse_WATCH_GET_VC_CONFIG(next_buff, next_buff_len);
                        break;
@@ -355,6 +363,26 @@ static bool mmi_protocol_fzd_content_parse(unsigned char * content_ptr, unsigned
                case MMI_FZD_WATCH_VC_CALL_RESPONSE:
                        break;
        #endif
+       #if 0 // def __MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__
+               case MMI_FZD_ACTION_VC_CALL_DIAL:
+                       mmi_protocol_fzd_parse_VC_CALL_DIAL(next_buff, next_buff_len);
+                       break;
+                       
+               case MMI_FZD_ACTION_VC_CALL_CANCEL:
+                       break;
+                       
+               case MMI_FZD_SERVER_VC_CALL_REFERRAL:
+                       mmi_protocol_fzd_parse_SERVER_VC_CALL_REFERRAL(next_buff, next_buff_len);
+                       break;
+
+               case MMI_FZD_SERVER_VC_CALL_RECOVER:
+                       mmi_protocol_fzd_parse_SERVER_VC_CALL_RECOVER(next_buff, next_buff_len);
+                       break;
+                       
+               case MMI_FZD_SERVER_VC_CALL_CANCEL:
+                       mmi_protocol_fzd_parse_SERVER_VC_CALL_CANCEL(next_buff, next_buff_len);
+                       break;
+       #endif
        #endif
 
        #ifdef __MMI_ZHSX_SUPPORT_DO_NOT_DISTURB__
@@ -465,8 +493,8 @@ static bool mmi_protocol_fzd_content_parse(unsigned char * content_ptr, unsigned
                #endif
        #endif
 
-       #ifdef __MMI_CUSTOM_HENGAI_TCMS__
-               case MMI_FZD_ACTION_HENGAI_TCMS_DATA:
+       #ifdef MMI_PROJECT_C55_DS_D11G_DT_HZCH
+               case MMI_FZD_ACTION_SEND_TELECOM_INFO:
                        break;
        #endif