gengxin
authorCCC <2393524978@qq.com>
Tue, 1 Aug 2023 08:34:01 +0000 (16:34 +0800)
committerCCC <2393524978@qq.com>
Tue, 1 Aug 2023 08:34:01 +0000 (16:34 +0800)
13 files changed:
2.sdk/sdk/gui/lv_drivers/indev/ACNT117.c
2.sdk/sdk/gui/lv_drivers/indev/ACNT180.c
2.sdk/sdk/gui/lv_drivers/indev/gh3018.c
2.sdk/sdk/gui/lv_drivers/indev/my_xMotion.h
2.sdk/sdk/gui/lv_watch/CMakeLists.txt
2.sdk/sdk/gui/lv_watch/app_adaptor/app_adaptor_sensor_interface.c
2.sdk/sdk/gui/lv_watch/app_adaptor/app_adaptor_sensor_interface.h
2.sdk/sdk/gui/lv_watch/framework/language/lang_ch.c
2.sdk/sdk/gui/lv_watch/framework/language/lang_en.c
2.sdk/sdk/gui/lv_watch/framework/message/message_sw_ui/sw_ui_msg_handle.c
2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_jrtc_client_fzd.c [new file with mode: 0644]
2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_fzd.c [new file with mode: 0644]
2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_fzd.h [new file with mode: 0644]

index 1d4a299..db7dc90 100644 (file)
@@ -121,7 +121,7 @@ void acnt117_measure_start(void)
 void acnt117_measure_stop(void)
 {
     watch_set_sleep_lcd_only(false);
-    asl_hr_bp_bo_measure_finish_flag_set();
+    //asl_hr_bp_bo_measure_finish_flag_set();
     sensor_task_send_message(ACNT117_ID,SENSOR_MSG_STOP);
 }
 float acnt117_get_body_temperature(void)
index 11365cd..0ab796b 100644 (file)
@@ -105,7 +105,7 @@ void acnt180_measure_start(void)
 void acnt180_measure_stop(void)
 {
     watch_set_sleep_lcd_only(false);
-    asl_hr_bp_bo_measure_finish_flag_set();
+    //asl_hr_bp_bo_measure_finish_flag_set();
     sensor_task_send_message(ACNT180_ID,SENSOR_MSG_STOP);
 }
 float acnt180_get_body_temperature(void)
index 6fe96a0..55f6c19 100644 (file)
@@ -180,7 +180,7 @@ void gh3018_measure_stop(void)
     SPO2_value = 0;
     watch_set_sleep_lcd_only(false);
     is_measuring_flag = false;
-    asl_hr_bp_bo_measure_finish_flag_set();
+    //asl_hr_bp_bo_measure_finish_flag_set();
     measure_mode = RUN_MODE_INVALID;
     sensor_task_send_message(GH3018_ID,SENSOR_MSG_STOP);
 }
index 4effe50..e368ef6 100644 (file)
@@ -34,7 +34,7 @@ struct my_xm_info_s
 };
 int xMotion_my_init(void);
 
-void get_Gsensor_fifo_xyz(int16_t _mems_data[32 * 3]);
+//void get_Gsensor_fifo_xyz(int16_t _mems_data[32 * 3]);
 
 void hal_xmotion_sleep_time_save(void);
 int hal_get_deep_sleep_time(void);
index 45f5c77..a237058 100644 (file)
@@ -206,6 +206,8 @@ set(lv_watch_sources
 #video call
        lv_apps/mmi_video_call/mmi_video_call.c
        lv_apps/mmi_video_call/mmi_jrtc_client.c
+       lv_apps/mmi_video_call/mmi_video_call_fzd.c
+       lv_apps/mmi_video_call/mmi_jrtc_client_fzd.c
 #wechat
        lv_apps/mmi_wechat/wechat_ui.c
 #primary menu data
index eafdeba..f130f0e 100644 (file)
  *      DEFINES
  *********************/
 
-/**********************
- *      TYPEDEFS
- **********************/
 
-/**********************
- *  STATIC PROTOTYPES
- **********************/
-
-/**********************
- *  STATIC VARIABLES
- **********************/
-
-static uint8_t measure_finish_flag = 0;
-
-
-/**********************
- *  GLOBAL FUNCTION
- **********************/
-
-/**************************sensor status***********************/
-void asl_sensor_id_check(void)
-{
-#if USE_BT_SENSOR_HUB
-    SensorHub_device_check_cmd();
-#else
-    return;
-#endif
-}
-
-
-/**************************Pedometer ********************/
-#ifdef __MMI_ZHSX_SUPPORT__
+// pedometer
 static nv_watch_pedometer_step_t s_pedometer_data = {0};
 uint32_t s_sensor_last_steps = 0;
 
-uint8_t asl_pedometer_sensor_id_get(void)
+uint8_t mmi_gsensor_sensor_id_get(void)
 {
-       return 0;
+       return (get_xmotion_id());
 }
 
 void asl_pedometer_poweron_on_init(void)
@@ -120,12 +90,129 @@ void asl_pedometer_steps_clear(void)
        hal_xmotion_steps_clear();
 }
 
-void asl_pedometer_xyz_get(int16_t *x, int16_t *y, int16_t *z)
+
+// heart sensor
+void mmi_hsensor_measure_value_clear(void)
+{
+#if USE_GH3018
+    gh3018_hr_bp_bo_value_clear();
+#endif
+}
+
+void mmi_hsensor_hr_measure_start(void)
+{
+    mmi_hsensor_measure_value_clear();
+       
+#if USE_GH3018
+    gh3018_measure_hr_start();
+#endif
+}
+
+void mmi_hsensor_spo2_measure_start(void)
+{
+    mmi_hsensor_measure_value_clear();
+
+#if USE_GH3018
+    gh3018_measure_bo_start();
+#endif
+}
+
+void mmi_hsensor_measure_stop(void)
 {
-       return ;
+#if USE_GH3018
+    gh3018_measure_stop();
+#endif
 }
 
+void mmi_hsensor_measure_value_get(uint16_t *hr, uint16_t *bp_high, uint16_t *bp_low, uint16_t *bo)
+{
+#if USE_GH3018
+    gh3018_hr_bp_bo_value_get(hr, bp_high, bp_low, bo);
+#endif
+
+       printf("[@CHENG_DEBUG][%s][%d]: %d,%d,%d,%d\n", __FUNCTION__, __LINE__, *hr, *bp_high, *bp_low, *bo);
+}
+
+
+//temperature sensor
+void mmi_tsensor_temperature_measure_start(void)
+{
+#if CT1711_PLUG_IN_SENSOR_HUB
+    SensorHub_temp_measure_start_cmd();
+#elif USE_CT1711
+       ct1711_measure_start();
+#elif USE_ACNT180
+    acnt180_measure_start();
+#elif USE_ACNT117
+    acnt117_measure_start();    
+#endif
+}
+
+void mmi_tsensor_temperature_measure_stop(void)
+{
+#if CT1711_PLUG_IN_SENSOR_HUB
+    SensorHub_temp_measure_stop_cmd();
+#elif USE_CT1711
+    ct1711_measure_stop();
+#elif USE_ACNT180
+    acnt180_measure_stop();
+#elif USE_ACNT117
+    acnt117_measure_stop();
+#endif
+}
+
+float mmi_tsensor_body_temperature_get(void)
+{
+#if CT1711_PLUG_IN_SENSOR_HUB
+    return SensorHub_body_temperature_get();
+#elif USE_CT1711
+    return ct1711_get_body_temperature();
+#elif USE_ACNT180
+    return acnt180_get_body_temperature();
+#elif USE_ACNT117
+    return acnt117_get_body_temperature();
 #else
+    return 0.0;
+#endif
+}
+
+
+
+uint8_t asl_hr_bp_bo_sensor_id_get(void)
+{
+#if USE_BT_SENSOR_HUB
+    return SensorHub_hr_bp_bo_sensor_id_get();
+#elif USE_GH3018
+    return get_gh3018_id();
+#else
+    return 0;
+#endif
+}
+
+void asl_hr_bp_bo_measure_start(uint8_t always)
+{
+    mmi_hsensor_measure_value_clear();
+    //asl_hr_bp_bo_measure_finish_flag_clear();
+#if USE_BT_SENSOR_HUB
+    SensorHub_hr_bp_bo_measure_cmd(MEASURE_NORMAL_MODE, 0, always);
+#elif USE_GH3018
+    gh3018_measure_hr_start();
+#else
+    return;
+#endif
+}
+
+#if 0
+
+/**************************sensor status***********************/
+void asl_sensor_id_check(void)
+{
+#if USE_BT_SENSOR_HUB
+    SensorHub_device_check_cmd();
+#else
+    return;
+#endif
+}
 
 uint8_t asl_pedometer_sensor_id_get(void)
 {
@@ -202,11 +289,6 @@ void asl_pedometer_xyz_get(int16_t *x, int16_t *y, int16_t *z)
 #endif
 }
 
-#endif
-
-
-/********************************hr_bp_bo **********************/
-#if 0
 uint16_t asl_HeartRate_hr_value_get(void)
 {
     nv_watch_hr_bp_bo_t heart_rate;
@@ -315,31 +397,6 @@ void asl_HeartRate_newday_clear(hal_rtc_t today)
         nv_hr_bp_bo_value_save(&data);
     }
 }
-#endif
-
-uint8_t asl_hr_bp_bo_sensor_id_get(void)
-{
-#if USE_BT_SENSOR_HUB
-    return SensorHub_hr_bp_bo_sensor_id_get();
-#elif USE_GH3018
-    return get_gh3018_id();
-#else
-    return 0;
-#endif
-}
-
-void asl_hr_bp_bo_value_get(uint16_t *hr, uint16_t *bp_high, uint16_t *bp_low, uint16_t *bo)
-{
-#if USE_BT_SENSOR_HUB
-    SensorHub_hr_bp_bo_value_get(hr, bp_high, bp_low, bo);
-#elif USE_GH3018
-    gh3018_hr_bp_bo_value_get(hr, bp_high, bp_low, bo);
-#else
-    return;
-#endif
-
-       printf("[@CHENG_DEBUG][%s][%d]: %d,%d,%d,%d\n", __FUNCTION__, __LINE__, *hr, *bp_high, *bp_low, *bo);
-}
 
 void asl_sport_hr_record_get(sport_hr_record_t * data)
 {
@@ -350,57 +407,6 @@ void asl_sport_hr_record_get(sport_hr_record_t * data)
 #endif
 }
 
-void asl_hr_bp_bo_value_clear(void)
-{
-#if USE_BT_SENSOR_HUB
-    SensorHub_hr_bp_bo_value_clear();
-#elif USE_GH3018
-    gh3018_hr_bp_bo_value_clear();
-#else
-    return;
-#endif
-}
-//心率单独测试
-void asl_hr_measure_start(uint8_t always)
-{
-    asl_hr_bp_bo_value_clear();
-    asl_hr_bp_bo_measure_finish_flag_clear();
-#if USE_BT_SENSOR_HUB
-    SensorHub_hr_bp_bo_measure_cmd(MEASURE_NORMAL_MODE, 0, always);
-#elif USE_GH3018
-    gh3018_measure_hr_start();
-#else
-    return;
-#endif
-}
-//血氧单独测试
-void asl_bo_measure_start(uint8_t always)
-{
-    asl_hr_bp_bo_value_clear();
-    asl_hr_bp_bo_measure_finish_flag_clear();
-#if USE_BT_SENSOR_HUB
-    SensorHub_hr_bp_bo_measure_cmd(MEASURE_NORMAL_MODE, 0, always);
-#elif USE_GH3018
-    gh3018_measure_bo_start();
-#else
-    return;
-#endif
-}
-
-//心率血氧血压测试
-void asl_hr_bp_bo_measure_start(uint8_t always)
-{
-    asl_hr_bp_bo_value_clear();
-    asl_hr_bp_bo_measure_finish_flag_clear();
-#if USE_BT_SENSOR_HUB
-    SensorHub_hr_bp_bo_measure_cmd(MEASURE_NORMAL_MODE, 0, always);
-#elif USE_GH3018
-    gh3018_measure_hr_start();
-#else
-    return;
-#endif
-}
-
 void asl_hr_bp_bo_sport_measure_start(uint32_t interval, uint8_t always)
 {
     asl_hr_bp_bo_value_clear();
@@ -426,17 +432,6 @@ void asl_hr_bp_bo_fac_mode_measure_start(uint8_t always)//factory mode, does not
 #endif
 }
 
-void asl_hr_bp_bo_measure_stop(void)
-{
-#if USE_BT_SENSOR_HUB
-    SensorHub_stop_measure_cmd();
-#elif USE_GH3018
-    gh3018_measure_stop();
-#else
-    return;
-#endif
-}
-
 void asl_hr_bp_bo_sport_record_request(void)
 {
 #if USE_BT_SENSOR_HUB
@@ -448,6 +443,9 @@ void asl_hr_bp_bo_sport_record_request(void)
 #endif
 }
 
+
+static uint8_t measure_finish_flag = 0;
+
 void asl_hr_bp_bo_measure_finish_flag_set(void)
 {
     measure_finish_flag = 1;
@@ -471,6 +469,8 @@ uint8_t asl_wear_state_get(void)
     return 0;
 #endif
 }
+#endif
+
 
 /**************temperature************/
 float asl_cur_temperature_get(void)
@@ -495,48 +495,6 @@ float asl_avg_temperature_get(void)
 #endif
 }
 
-float asl_body_temperature_get(void)
-{
-#if CT1711_PLUG_IN_SENSOR_HUB
-    //TODO:
-    return SensorHub_body_temperature_get();
-#elif USE_CT1711
-    return ct1711_get_body_temperature();
-#elif USE_ACNT180
-    return acnt180_get_body_temperature();
-#elif USE_ACNT117
-    return acnt117_get_body_temperature();
-#else
-    return 0;
-#endif
-}
-
-void asl_temperature_measure_start(void)
-{
-#if CT1711_PLUG_IN_SENSOR_HUB
-    SensorHub_temp_measure_start_cmd();
-#elif USE_CT1711
-       ct1711_measure_start();
-#elif USE_ACNT180
-    acnt180_measure_start();
-#elif USE_ACNT117
-    acnt117_measure_start();    
-#endif
-}
-
-void asl_temperature_measure_stop(void)
-{
-#if CT1711_PLUG_IN_SENSOR_HUB
-    SensorHub_temp_measure_stop_cmd();
-#elif USE_CT1711
-    ct1711_measure_stop();
-#elif USE_ACNT180
-    acnt180_measure_stop();
-#elif USE_ACNT117
-    acnt117_measure_stop();
-#endif
-}
-
 int asl_chip_temperature_get(void)
 {
     /* get 3603 chip temperature */
index 968ec8d..22b1b58 100644 (file)
@@ -65,10 +65,10 @@ enum{
  *   GLOBAL PROTOTYPES
 ***********************/
 
-void asl_sensor_id_check(void);
+//void asl_sensor_id_check(void);
 
 /**************************Pedometer ********************/
-uint8_t asl_pedometer_sensor_id_get(void);
+//uint8_t asl_pedometer_sensor_id_get(void);
 void asl_pedometer_poweron_on_init(void);
 void asl_pedometer_steps_update(uint32_t steps);
 uint32_t asl_pedometer_steps_get(void);
@@ -78,10 +78,25 @@ void asl_pedometer_steps_save(bool to_nv);
 void asl_pedometer_steps_save(void);
 #endif
 void asl_pedometer_steps_clear(void);
-void asl_pedometer_xyz_get(int16_t *x, int16_t *y, int16_t *z);
+//void asl_pedometer_xyz_get(int16_t *x, int16_t *y, int16_t *z);
+
+uint8_t mmi_gsensor_sensor_id_get(void);
+
 
 
 /*hr_bp_bo*/
+void mmi_hsensor_measure_value_clear(void);
+void mmi_hsensor_hr_measure_start(void);
+void mmi_hsensor_spo2_measure_start(void);
+void mmi_hsensor_measure_stop(void);
+void mmi_hsensor_measure_value_get(uint16_t *hr, uint16_t *bp_high, uint16_t *bp_low, uint16_t *bo);
+
+
+void mmi_tsensor_temperature_measure_start(void);
+void mmi_tsensor_temperature_measure_stop(void);
+float mmi_tsensor_body_temperature_get(void);
+
+
 #if 0
 uint16_t asl_HeartRate_hr_value_get(void);
 void asl_HeartRate_bp_value_get(uint16_t *bp_high, uint16_t *bp_low);
@@ -100,26 +115,20 @@ void als_HeartRate_measure_finish_flag_clear(void);
 #endif
 
 uint8_t asl_hr_bp_bo_sensor_id_get(void);
-void asl_hr_bp_bo_value_get(uint16_t *hr, uint16_t *bp_high, uint16_t *bp_low, uint16_t *bo);
-void asl_sport_hr_record_get(sport_hr_record_t * data);
-void asl_hr_bp_bo_value_clear(void);
+//void asl_sport_hr_record_get(sport_hr_record_t * data);
 void asl_hr_bp_bo_measure_start(uint8_t always);
-void asl_hr_bp_bo_sport_measure_start(uint32_t interval, uint8_t always);
-void asl_hr_bp_bo_fac_mode_measure_start(uint8_t always);//factory mode, does not auto stop
-void asl_hr_bp_bo_measure_stop(void);
-void asl_hr_bp_bo_sport_record_request(void);
-void asl_hr_bp_bo_measure_finish_flag_set(void);
-uint8_t asl_hr_bp_bo_measure_finish_flag(void);
-void asl_hr_bp_bo_measure_finish_flag_clear(void);
+//void asl_hr_bp_bo_sport_measure_start(uint32_t interval, uint8_t always);
+//void asl_hr_bp_bo_fac_mode_measure_start(uint8_t always);//factory mode, does not auto stop
+//void asl_hr_bp_bo_sport_record_request(void);
+//void asl_hr_bp_bo_measure_finish_flag_set(void);
+//uint8_t asl_hr_bp_bo_measure_finish_flag(void);
+//void asl_hr_bp_bo_measure_finish_flag_clear(void);
 
-uint8_t asl_wear_state_get(void);
+//uint8_t asl_wear_state_get(void);
 
 /**************temperature************/
 float asl_cur_temperature_get(void);
 float asl_avg_temperature_get(void);
-float asl_body_temperature_get(void);
-void asl_temperature_measure_start(void);
-void asl_temperature_measure_stop(void);
 int asl_chip_temperature_get(void);
 
 
index 9847ebf..97a491f 100644 (file)
@@ -263,7 +263,7 @@ const void * lang_text_ch[] = {
     "开启LTEPOWER",
     "播放音乐",
     "CPU重载",
-    "gsensor",
+    "Gsensor",
     "全选",
     "清空",
 
@@ -794,8 +794,8 @@ const void * lang_text_ch[] = {
     "回环测试中",
     "充电测试",
     "充电器",
-    "gsensor 测试成功",
-    "gsensor 测试失败",
+    "Gsensor 测试成功",
+    "Gsensor 测试失败",
     "无信号",
     "WIFI扫描测试中...",
     "WIFI扫描测试成功",
@@ -860,6 +860,10 @@ const void * lang_text_ch[] = {
     "语音呼入中", // WATCH_TEXT_ID_VOICE_CALL_RINGING,
     "通讯录", // WATCH_TEXT_ID_PHONEBOOK,
     "请在APP设置闹钟", // WATCH_TEXT_ID_NO_ALARM,
+    "心率测试", // WATCH_TEXT_ID_HEART_TEST, 
+    "血氧测试", // WATCH_TEXT_ID_SPO2_TEST,
+    "体温测试", // WATCH_TEXT_ID_TEMPERATURE_TEST,
+    "秒后\n设备将关机", // WATCH_TEXT_ID_NO_SIM_POWER_OFF_PROMPT,
 
 
     //CHENG_MODIFY
index 91c8625..d9e6feb 100644 (file)
@@ -264,7 +264,7 @@ const void * lang_text_en[] = {
     "Open LTEPOWER",
     "Play music",
     "CPU overload",
-    "gsensor",
+    "Gsensor",
     "Select all",
     "Select none",
 
@@ -795,8 +795,8 @@ const void * lang_text_en[] = {
     "Loopback testing",
     "Charger test",
     "charger",
-    "gsensor test succ",
-    "gsensor test fail",
+    "Gsensor test succ",
+    "Gsensor test fail",
     "No signal",
     "WIFI scan is testing...",
     "WIFI scanning test succ",
@@ -860,6 +860,10 @@ const void * lang_text_en[] = {
     "Ringing", // WATCH_TEXT_ID_VOICE_CALL_RINGING, 
     "Phonebook", // WATCH_TEXT_ID_PHONEBOOK,
     "No alarm", // WATCH_TEXT_ID_NO_ALARM,
+    "Heart test", // WATCH_TEXT_ID_HEART_TEST,
+    "Spo2 test", // WATCH_TEXT_ID_SPO2_TEST,
+    "Temperatur test", // WATCH_TEXT_ID_TEMPERATURE_TEST,
+    "s later\ndevice will shut down", // WATCH_TEXT_ID_NO_SIM_POWER_OFF_PROMPT,
 
 
     //CHENG_MODIFY
index 80655f1..36d0ff1 100644 (file)
@@ -95,7 +95,7 @@ void SensorHub_ui_message_handle_impl(uint16_t msgid, void * msg)
         }
 
         case MMI_SENSORHUB_SENSOR_STATUS_UPDATE_MSG: {
-            printf("GSENSOR:%d,HR:%d\r\n", asl_pedometer_sensor_id_get(), asl_hr_bp_bo_sensor_id_get());
+            //printf("GSENSOR:%d,HR:%d\r\n", asl_pedometer_sensor_id_get(), asl_hr_bp_bo_sensor_id_get());
             //todo
             break;
         }
diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_jrtc_client_fzd.c b/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_jrtc_client_fzd.c
new file mode 100644 (file)
index 0000000..c723cc8
--- /dev/null
@@ -0,0 +1,316 @@
+
+
+
+#include "lv_watch.h"
+
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__
+
+//#include <jrtc.h>
+#include "../../../../product/craneg_modem/framework/inc/jrtc.h"
+
+
+typedef enum jrtc_state video_call_jrtc_state_e;
+typedef enum jrtc_error video_call_jrtc_error_e;
+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] = "efe9f8800a39d96244234097";
+       char key[16+1] = "25v9C652123QL3N8";
+       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_no_carrier(1);
+               }
+               break;
+
+           case JRTC_LEAVING:
+               break;
+
+           case JRTC_OPENED:
+               break;
+
+           case JRTC_JOINING:
+               break;
+
+           case JRTC_JOINED:
+               break;
+
+           case JRTC_TALKING:
+                       mmi_vc_call_action_connected();
+
+               /* Get image */
+               if (MODEM_VIDEO_CALL_TYPE_VIDEO == mmi_video_call_params_type_get()) 
+                       {
+                   void *buf = mmi_video_call_phone_get_video_buffer();
+                   if(voip_jrtc_get_image(buf)) 
+                               {
+                       lv_canvas_set_buffer(mmi_vc_call_get_ext()->canvas, buf, canvas_width, canvas_heigh, LV_IMG_CF_TRUE_COLOR);
+                   }
+               }
+               break;
+
+           default:
+               break;
+    }
+
+    oldstate = state;
+}
+
+
+static int8_t mmi_video_call_jrtc_open(const char* roomid, MODEM_VIDEO_CALL_TYPE calltype, char * t_ticket)
+{
+       char ticket[MMI_WATCH_VC_TICKET_LEN] = {0};
+       memcpy(ticket, t_ticket, MMI_WATCH_VC_TICKET_LEN - 1);
+
+       //char imei[16] = {0};
+       //app_adp_get_imei_req(imei);
+       //strncpy(ticket, imei, 16);
+
+       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);
+
+    Hal_Mem_Set(&s_video_call_jrtc, 0, sizeof(MMI_VIDEO_CALL_JRTC_T));
+       
+    if (MODEM_VIDEO_CALL_TYPE_VIDEO == calltype) 
+       {
+        s_video_call_jrtc.rxframe.width  = s_video_call_jrtc.txframe.width  = 176;
+        s_video_call_jrtc.rxframe.height = s_video_call_jrtc.txframe.height = 144;
+        s_video_call_jrtc.rxframe.fps    = s_video_call_jrtc.txframe.fps    = 8; // 10;
+        s_video_call_jrtc.rxframe.kbps   = s_video_call_jrtc.txframe.kbps   = 120; // 240;
+
+               mci_videocall_camera_set_sensor(1); // 0:rear camera; 1:front camera
+               
+        s_video_call_jrtc.jrtc_ptr= jrtc_open(roomid, ticket, &s_video_call_jrtc.rxframe, &s_video_call_jrtc.txframe);
+    } 
+       else 
+       {
+        s_video_call_jrtc.jrtc_ptr= jrtc_open(roomid, ticket, NULL, NULL);
+    }
+
+    if (!s_video_call_jrtc.jrtc_ptr) 
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+        mmi_video_call_jrtc_clean_up();
+        return -1;
+    }
+    jrtc_activate(s_video_call_jrtc.jrtc_ptr, JRTC_AUDIO|JRTC_CAMERA);
+
+    s_video_call_jrtc.state_task = lv_task_create(mmi_video_call_jrtc_on_state, VIDEO_RENDER_PERIOD, LV_TASK_PRIO_HIGH, NULL);
+    return 0;
+}
+
+int8_t mmi_video_call_dial_req(MODEM_VIDEO_CALL_TYPE calltype, char * pContactUri, 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(1);
+       
+    if (NULL != s_video_call_jrtc.jrtc_ptr) 
+       {
+        video_call_jrtc_error_e err = (TRUE == bye) ? JRTC_EBYE : JRTC_EAUDIOCALL;
+
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %p,%d\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr, err);
+               
+        jrtc_close(s_video_call_jrtc.jrtc_ptr, err);
+        s_video_call_jrtc.closing = 1;
+    } 
+       else
+       {
+        mmi_vc_ring_off_no_carrier(0);
+    }
+}
+
+int8_t mmi_video_call_answer_req(char * t_ticket)
+{
+    int8_t ret = -1;
+
+       //mmi_vc_call_operate_send_to_server(1);
+       
+    if (NULL == s_video_call_jrtc.jrtc_ptr)
+       {
+        ret = mmi_video_call_jrtc_open(mmi_video_call_params_number_get(), mmi_video_call_params_type_get(), 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(0);
+
+    if (NULL != s_video_call_jrtc.jrtc_ptr) 
+       {
+        video_call_jrtc_error_e err = (TRUE == bye) ? JRTC_EBYE : JRTC_EAUDIOCALL;
+
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %p,%d\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr, err);
+               
+        jrtc_close(s_video_call_jrtc.jrtc_ptr, err);
+        s_video_call_jrtc.closing = 1;
+    } 
+       else 
+       {
+        mmi_vc_ring_off_no_carrier(0);
+    }
+}
+
+
+//extern unsigned yuv420_scale(int src_width, int src_height, int dst_width, int dst_height,     unsigned char *src_buf, unsigned char *dst_buf, unsigned char semi);
+//extern unsigned rgb565_scale(int32_t src_width, int32_t src_height, int32_t dst_width, int32_t dst_height, uint8_t *src_buf, uint8_t *dst_buf);
+//extern void yuv420_2_rgb565(int width, int height, const unsigned char *src, unsigned short *dst, unsigned semi);
+
+static uint8_t voip_jrtc_get_image(void * preview_buf)
+{
+    uint8_t ret = 0;
+    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+    LV_ASSERT_MEM(ext);
+
+    video_call_jrtc_image_t * frame = NULL;
+    if(ext->local_remote_switch_flag == VOIP_REMOTE_SWITCH_REMOTE)
+        frame = &s_video_call_jrtc.rxframe;
+    else
+        frame = &s_video_call_jrtc.txframe;
+
+    if (frame->put != frame->get) {
+#if (ENABLE_VIDEO_SCALE == 0)
+        yuv420_2_rgb565(frame->width, frame->height, frame->data, preview_buf, frame->format);
+#else
+        Hal_Yuv420_Render(frame->width, frame->height, canvas_width, canvas_heigh, frame->data, preview_buf, frame->format);
+#endif
+
+        frame->get = frame->put;
+        ret = 1;
+        voip_fps_check(frame->fps);
+    }
+
+    return ret;
+}
+
+#endif
+#endif
+
diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_fzd.c b/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_fzd.c
new file mode 100644 (file)
index 0000000..60da4ba
--- /dev/null
@@ -0,0 +1,2018 @@
+
+
+
+#include "lv_watch.h"
+
+
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__
+
+#include "mmi_video_call_fzd.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+
+//static lv_signal_cb_t ancestor_signal;
+#if VIDEO_SIGNAL_CHECK
+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_video_call_ticket[MMI_WATCH_VC_TICKET_LEN] = {0};
+static char s_video_call_tokens[MMI_WATCH_VC_TOKENS_LEN] = {0};
+
+
+/**********************
+*  STATIC PROTOTYPES
+**********************/
+static lv_obj_t * voip_ring_off_content_create(lv_obj_t * par);
+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_get_time_elaps(uint32_t last_time, char * str, int8_t size);
+static void voip_set_volume_when_slider_act(void);
+static void voip_local_remote_switch_action(lv_obj_t * btn, lv_event_t e);
+static void canvas_button_hidden_event_cb(lv_obj_t * obj, lv_event_t e);
+static void 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_fzd();
+        Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
+    }
+}
+
+void * mmi_video_call_phone_get_video_buffer()
+{
+    return g_cbuf;
+}
+
+/**********************
+*   STATIC FUNCTIONS
+**********************/
+static lv_obj_t * mmi_vc_call_get_activity_obj(void)
+{
+    lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE);
+
+    return(activity_obj);
+}
+
+static lv_obj_t * mmi_vc_call_get_obj(void)
+{
+    lv_obj_t * watch_obj = NULL;
+
+    lv_obj_t * activity_obj = mmi_vc_call_get_activity_obj();
+
+    if(activity_obj) 
+       {
+        lv_watch_get_child_obj(activity_obj, lv_watch_obj_signal, &watch_obj);
+    }
+
+    return(watch_obj);
+}
+
+lv_vc_call_obj_ext_t * mmi_vc_call_get_ext(void)
+{
+    lv_vc_call_obj_ext_t * ext = NULL;
+    lv_obj_t * watch_obj = mmi_vc_call_get_obj();
+
+    if(watch_obj) 
+       {
+        ext = lv_obj_get_ext_attr(watch_obj);
+    }
+
+    return(ext);
+}
+
+static void mmi_vc_call_screen_clean(void)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    lv_obj_t * slider_activit_obj = lv_watch_get_activity_obj(ACT_ID_SLIDER);
+
+    if(slider_activit_obj)
+       {
+        lv_obj_del(slider_activit_obj);
+    }
+
+    lv_obj_t * activity_obj = mmi_vc_call_get_activity_obj();
+    if(activity_obj) 
+       {
+        lv_obj_del(activity_obj);
+    }
+}
+
+static void voip_phone_left_slide_callback(lv_obj_t * obj)
+{
+    printf("%s %d\n", __FUNCTION__, __LINE__);
+        if((MMI_VIDEO_CALL_STATE_CALLING == s_video_call_params.state)
+                && (MODEM_VIDEO_CALL_TYPE_VIDEO == s_video_call_params.call_type)) {
+            voip_local_remote_switch_action(NULL, LV_EVENT_CLICKED);
+        }
+}
+
+static void voip_phone_right_slide_callback(lv_obj_t * obj)
+{
+    printf("%s %d\n", __FUNCTION__, __LINE__);
+    mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);
+}
+
+static void voip_phone_down_slide_callback(lv_obj_t * obj)
+{
+    printf("%s %d\n", __FUNCTION__, __LINE__);
+    voip_volume_btn_action(NULL, LV_EVENT_CLICKED);
+}
+
+static void voip_slider_action(lv_obj_t * slider, lv_event_t e)
+{
+    if(e == LV_EVENT_VALUE_CHANGED)
+    {
+        printf("%s %d\n", __FUNCTION__, __LINE__);
+
+        uint8_t v = lv_slider_get_value(slider);
+
+        // set speaker volume
+        if(!Hal_Set_BT_Audio_Path((HAL_SPEAKER_GAIN)v))
+            Hal_Call_Speaker(HAL_CALL_SPK_ON, (HAL_SPEAKER_GAIN)v);
+        s_video_call_params.speaker_volume = v;
+    }
+}
+
+static void voip_volume_btn_action(lv_obj_t * obj, lv_event_t e)
+{
+    if(LV_EVENT_CLICKED != e) {
+        return;
+    }
+
+    printf("%s %d\n", __FUNCTION__, __LINE__);
+    slider_create(NULL, SETTING_VOIP_SPEAKER, 40, voip_slider_action);
+}
+
+static void voip_phone_obj_hide_anim_end(lv_anim_t * anim)
+{
+    (void)anim;
+    printf("%s %d\n", __FUNCTION__, __LINE__);
+
+    mmi_vc_call_screen_clean();
+}
+
+static lv_obj_t * voip_ring_off_content_create(lv_obj_t * par)
+{
+    printf("%s %d\n", __FUNCTION__, __LINE__);
+    if(par == NULL) {
+        par = lv_scr_act();
+    }
+
+    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+    LV_ASSERT_MEM(ext);
+    if(ext == NULL) {
+        return(NULL);
+    }
+
+    lv_obj_t * obj = lv_obj_create(par, NULL);
+    LV_ASSERT_MEM(obj);
+    if(obj == NULL) {
+        return(NULL);
+    }
+    lv_obj_set_size(obj, lv_obj_get_width(par), lv_obj_get_height(par));
+    lv_obj_add_style(obj, LV_OBJ_PART_MAIN, &lv_style_transp_tight);
+
+    lv_obj_t * content = lv_cont_create(obj, NULL);
+    LV_ASSERT_MEM(content);
+    if(content == NULL) {
+        return(NULL);
+    }
+
+    lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_cont_opa1);
+    lv_obj_set_size(content, 204, 44);
+    if(ext->vc_ui == MMI_VC_UI_INCOMING || ext->vc_ui == MMI_VC_UI_DIALING) {
+        lv_obj_align(content, obj, LV_ALIGN_IN_TOP_MID, 0, 10);
+    } else {
+        lv_obj_align(content, obj, LV_ALIGN_CENTER, 0, -12);
+    }
+    lv_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_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] = "";
+            voip_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] = "";
+    voip_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 voip_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) {
+        if(lv_lang_act() == LANG_CH) {
+            snprintf(str, size, "%.2d:%.2d", minutes, seconds);
+        } else {
+            snprintf(str, size, "%.2d:%.2d", minutes, seconds);
+        }
+    } else {
+        if(lv_lang_act() == LANG_CH) {
+            snprintf(str, size, "%.2d:%.2d:%.2d", hours, minutes, seconds);
+        } else {
+            snprintf(str, size, "%.2d:%.2d:%.2d", hours, minutes, seconds);
+        }
+    }
+}
+
+void mmi_vc_ring_off_no_carrier(uint8_t isNoCarrier)
+{
+    if((false == s_video_call_params.ring_off_timeout)
+            && (1 == isNoCarrier)
+            && (MMI_VIDEO_CALL_STATE_NONE == s_video_call_params.state)) 
+    {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+        return;
+    }
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    // stop playing tone
+    Hal_Tone_Play_End();
+
+    // stop timer
+    mmi_vc_ring_off_timer_stop();
+       mmi_vc_dialing_timer_stop();
+       mmi_vc_connecting_timer_stop();
+
+    // create ring off UI
+    lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE);
+    if(activity_obj) 
+       {
+        mmi_video_call_phone_ring_off_create();
+    }
+
+    if(MMI_MODEM_CALL_STATE_NULL != phone_get_call_state()) 
+       {
+        printf("%s tele call is on going, keep para of audio\n", __FUNCTION__);
+        Hal_Set_Voice_Call_Status(VOICE_CALL_END);
+        Hal_Disconnect_BT_Audio_Path();
+    }
+    Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
+    watch_wakeup_time_reset();
+
+    Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+}
+
+static bool mmi_vc_check_mo_permission(void)
+{
+    if((!watch_modem_sim_present_check_req())
+               || (MMI_MODEM_SIGNAL_BAR_0 == watch_modem_get_signal_bar_req())
+//       || (MODEM_VIDEO_CALL_REG_OK != watch_modem_video_call_get_reg_stat_req())
+               || (is_rat_gsm())
+               ) 
+       {
+               return false;
+       }
+       
+    return true;
+}
+
+static void voip_local_remote_switch_action(lv_obj_t * btn, lv_event_t e)
+{
+    if(LV_EVENT_CLICKED != e) {
+        return;
+    }
+
+    printf("%s %d\n", __FUNCTION__, __LINE__);
+    lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE);
+    if(!activity_obj) {
+        return;
+    }
+    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+    if(!ext) {
+        return;
+    }
+    if(ext->local_remote_switch_flag == VOIP_REMOTE_SWITCH_NULL) {
+        return;
+    }
+    if(ext->local_remote_switch_flag == VOIP_REMOTE_SWITCH_REMOTE) {
+        ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_LOCAL;
+    } else {
+        ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_REMOTE;
+    }
+}
+
+static lv_res_t video_call_element_signal_func(lv_obj_t * element, lv_signal_t sign, void * param)
+{
+    lv_res_t res;
+
+    //printf("%s, sign=%d\n", __FUNCTION__, sign);
+    /* if not click signs, invoke ancient handler and return */
+    if(sign != LV_SIGNAL_PRESSING && sign != LV_SIGNAL_PRESSED && sign != LV_SIGNAL_RELEASED && sign != LV_SIGNAL_PRESS_LOST) {
+        /* Include the ancient signal function */
+        lv_signal_cb_t sign_func = (lv_signal_cb_t)(lv_obj_get_user_data(element).user_data);
+        res = sign_func(element, sign, param);
+        if(res != LV_RES_OK) {
+            return(res);
+        }
+
+        return(LV_RES_OK);
+    }
+
+    lv_obj_t * obj = lv_obj_get_parent(element);
+    while(obj) {
+        if(lv_obj_get_signal_cb(obj) != lv_watch_obj_signal) {
+            obj = lv_obj_get_parent(obj);
+        } else {
+            break;
+        }
+    }
+    if(obj == NULL) {
+        return(LV_RES_INV);
+    }
+
+    res = lv_watch_obj_signal(obj, sign, param);
+    if(res != LV_RES_OK) {
+        return(res);
+    }
+
+    /* Include the ancient signal function */
+    lv_signal_cb_t sign_func = (lv_signal_cb_t)(lv_obj_get_user_data(element).user_data);
+    res = sign_func(element, sign, param);
+    if(res != LV_RES_OK) {
+        return(res);
+    }
+
+    return(LV_RES_OK);
+} /* video_call_element_signal_func */
+
+static void video_call_add_element(lv_obj_t * element)
+{
+    lv_watch_set_free_ptr(element, lv_obj_get_signal_cb(element));
+    lv_obj_set_signal_cb(element, video_call_element_signal_func);
+    lv_obj_add_protect(element, LV_PROTECT_PRESS_LOST | LV_PROTECT_CLICK_FOCUS);
+}
+
+static void canvas_button_hidden_event_cb(lv_obj_t * obj, lv_event_t e)
+{
+    if(LV_EVENT_CLICKED == e) 
+       {
+        printf("%s %d\n", __FUNCTION__, __LINE__);
+        lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+        if(!ext) {
+            return;
+        }
+        if(ext->canvas_button_hidden_flag == NOT_HIDDEN) {
+            ext->canvas_button_hidden_flag = HIDDEN;
+        } else {
+            ext->canvas_button_hidden_flag = NOT_HIDDEN;
+        }
+
+        lv_obj_set_hidden(ext->connect_time, ext->canvas_button_hidden_flag);
+        lv_obj_set_hidden(ext->volume_button, ext->canvas_button_hidden_flag);
+        lv_obj_set_hidden(ext->view_switch_button, true); // lv_obj_set_hidden(ext->view_switch_button, ext->canvas_button_hidden_flag);
+        lv_obj_set_hidden(ext->ring_off_button, ext->canvas_button_hidden_flag);
+    }
+}
+
+static void voip_set_volume_when_slider_act(void)
+{
+    printf("%s\n", __FUNCTION__);
+    if(lv_watch_get_activity_obj(ACT_ID_SLIDER)) {
+        if(MMI_VIDEO_CALL_STATE_NONE != s_video_call_params.state) {
+            uint8_t volume = mmi_vc_get_call_volume_fzd();
+            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);
+
+}
+
+// state: 0-reject; 1-hang up
+void mmi_vc_call_operate_send_to_server(uint_8 flag)
+{
+       if(0 == flag)
+               mmi_protocol_fzd_action_VC_CALL_RESPONSE(s_video_call_params.number, s_video_call_ticket, s_video_call_params.call_type);
+       else if(1 == flag)
+               mmi_protocol_fzd_action_VC_CALL_RESPONSE(NULL, NULL, 0);
+}
+
+void mmi_vc_ring_off_timer_stop(void)
+{
+       if(NULL != s_video_call_params.ring_off_timer_id) 
+       {
+               Hal_Timer_Stop(s_video_call_params.ring_off_timer_id);
+               s_video_call_params.ring_off_timer_id = NULL;
+       }
+}
+
+void mmi_vc_dialing_timer_stop(void)
+{
+       if(NULL != s_video_call_params.dialing_timer_id) 
+       {
+               Hal_Timer_Stop(s_video_call_params.dialing_timer_id);
+               s_video_call_params.dialing_timer_id = NULL;
+       }
+}
+
+void mmi_vc_connecting_timer_stop(void)
+{
+       if(NULL != s_video_call_params.connecting_timer_id) 
+       {
+               Hal_Timer_Stop(s_video_call_params.connecting_timer_id);
+               s_video_call_params.connecting_timer_id = NULL;
+       }
+}
+
+static void mmi_vc_ui_prepare_destory(lv_obj_t * activity_obj)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    lv_watch_png_cache_all_free();
+
+    // stop playing tone
+    Hal_Tone_Play_End();
+
+    // ring off
+    mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);
+
+    // stop ring off timer
+    mmi_vc_ring_off_timer_stop();
+
+    // stop callreq timer
+    mmi_vc_dialing_timer_stop();
+
+       //stop
+       mmi_vc_connecting_timer_stop();
+
+    Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+    s_video_call_params.state = MMI_VIDEO_CALL_STATE_NONE;
+}
+
+static void mmi_vc_hook_action(lv_obj_t * btn, lv_event_t e)
+{
+    if(LV_EVENT_CLICKED != e) 
+       {
+        return;
+    }
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    //if(btn) {
+    //    lv_obj_set_click(btn, false);
+    //}
+
+    Hal_Tone_Play_End();
+
+       mmi_vc_call_action_connecting();
+       
+       //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_no_carrier(0);
+    }
+}
+
+
+lv_res_t mmi_video_call_phone_ring_off_create()
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+    if(ext == NULL) 
+       {
+        return(LV_RES_INV);
+    }
+
+    // stop callreq timer
+    mmi_vc_dialing_timer_stop();
+
+    if(ext->vc_ui == MMI_VC_UI_INCOMING || ext->vc_ui == MMI_VC_UI_DIALING) 
+       {
+        if(ext->phone_status_label) {
+            lv_label_set_text(ext->phone_status_label, "");
+        }
+
+        voip_ring_off_content_create(mmi_vc_call_get_obj());
+    } 
+       else if(ext->vc_ui == MMI_VC_UI_CONNECTED) 
+       {
+        voip_ring_off_content_create(mmi_vc_call_get_obj());
+    }
+
+    if(ext->phone_animation_obj) {
+        lv_obj_del(ext->phone_animation_obj);
+        ext->phone_animation_obj = NULL;
+    }
+
+    /* set speaker volume to nv when leaving activiry's slider */
+    voip_set_volume_when_slider_act();
+
+    /* phone cleanup when anim end*/
+    lv_anim_t a;
+    lv_anim_init(&a);
+    lv_anim_set_var(&a, mmi_vc_call_get_obj());
+    lv_anim_set_ready_cb(&a, (lv_anim_ready_cb_t)voip_phone_obj_hide_anim_end);
+    lv_anim_set_time(&a, VOIP_PHONE_RING_OFF_CONTINUE_TIME);
+    lv_anim_start(&a);
+
+    voip_signal_check_stop();
+    voip_rat_check_stop();
+
+    return(LV_RES_OK);
+}
+
+static void mmi_vc_ring_off_timeout_cb(void * para)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+    s_video_call_params.ring_off_timer_id = NULL;
+    s_video_call_params.ring_off_timeout  = true;
+    mmi_vc_ring_off_no_carrier(0);
+}
+
+void mmi_vc_ring_off_action(lv_obj_t * btn, lv_event_t e)
+{
+    if(LV_EVENT_CLICKED != e) 
+       {
+        return;
+    }
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, s_video_call_params.state);
+
+       mmi_vc_dialing_timer_stop();
+    mmi_vc_connecting_timer_stop();
+       
+    if(false == s_video_call_params.ring_off) 
+       {
+        s_video_call_params.ring_off = true;
+
+        if(NULL == s_video_call_params.ring_off_timer_id) 
+               {
+            s_video_call_params.ring_off_timer_id = Hal_Timer_Start(VOIP_RING_OFF_TIMER_LEN, mmi_vc_ring_off_timeout_cb, NULL, 0);
+        }
+    }
+
+    switch(s_video_call_params.state) 
+       {
+        case MMI_VIDEO_CALL_STATE_NONE:
+        case MMI_VIDEO_CALL_STATE_INVALID:
+            // do noting
+            break;
+
+        case MMI_VIDEO_CALL_STATE_CALLING:
+            mmi_video_call_hangup_req(TRUE);
+            break;
+
+        case MMI_VIDEO_CALL_STATE_INCOMING:
+            Hal_Tone_Play_End();
+            mmi_video_call_reject_req(TRUE);
+            break;
+
+        default:
+            mmi_video_call_hangup_req(TRUE);
+            break;
+       }
+
+    voip_signal_check_stop();
+    voip_rat_check_stop();
+}
+
+void mmi_ui_msg_update_vc_call_stop(void)
+{
+       mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);         
+}
+
+void mmi_vc_call_action_call_stop(void)
+{
+       mmi_watch_wake_up();
+       mmi_ui_msg_action_vc_call_stop();
+}
+
+static void mmi_vc_ui_dialing(lv_obj_t * content)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+    if(ext == NULL) 
+       {
+        return;
+    }
+
+       lv_obj_t * label;
+       uint32_t text_id = WATCH_TEXT_ID_VIDEO_CALL_DAILING;
+       if(MODEM_VIDEO_CALL_TYPE_VIDEO != s_video_call_params.call_type)
+               text_id = WATCH_TEXT_ID_VOICE_CALL_DAILING;
+
+    // label dialing
+    label = lv_label_create(content, NULL);
+    lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20);
+    lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+    lv_label_set_text_id(label, text_id);
+    lv_obj_set_click(label, false);
+       lv_obj_align(label, content, LV_ALIGN_IN_TOP_MID, 0, 10);
+    ext->phone_status_label = label;
+
+    // img
+    lv_obj_t * img = lv_img_create(content, NULL);
+       lv_img_set_src(img, ICON_VIDEO_CALL_CONTACT_PHOTO);
+       lv_obj_align(img, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
+    lv_obj_set_click(img, false);
+
+    // name
+    label = lv_label_create(content, NULL);
+    lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+    lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+       lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL);
+       lv_obj_set_width(label, lv_obj_get_width(content) - 20);
+    if(strlen(s_video_call_params.name) > 0) 
+       {
+        lv_label_set_text(label, s_video_call_params.name);
+    } 
+       else 
+       {
+        lv_label_set_text(label, s_video_call_params.number);
+    }
+       lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
+    lv_obj_set_click(label, false);
+
+       #if 0
+    // btn volume
+    lv_obj_t * btn;
+    btn = lv_imgbtn_create(cont, NULL);
+    lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_PHONE_RING_VOLUME);
+    lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_PHONE_RING_VOLUME);
+    lv_obj_set_event_cb(btn, voip_volume_btn_action);
+    lv_obj_align(btn, cont, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
+       #endif
+
+    // btn ring off
+    lv_obj_t * btn = lv_imgbtn_create(content, NULL);
+    lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN);
+    lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN);
+    lv_obj_set_event_cb(btn, mmi_vc_ring_off_action);
+    lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_MID, 0, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+}
+
+static void mmi_vc_ui_incoming(lv_obj_t * content)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+    if(ext == NULL) 
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+        return;
+    }
+    lv_obj_t * label;
+       uint32_t text_id = WATCH_TEXT_ID_VIDEO_CALL_RINGING;
+       if(MODEM_VIDEO_CALL_TYPE_VIDEO != s_video_call_params.call_type)
+               text_id = WATCH_TEXT_ID_VOICE_CALL_RINGING;
+
+    // label ringing
+    label = lv_label_create(content, NULL);
+    lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20);
+    lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+    lv_label_set_text_id(label, text_id);
+    lv_obj_set_click(label, false);
+       lv_obj_align(label, content, LV_ALIGN_IN_TOP_MID, 0, 10);
+    ext->phone_status_label = label;
+
+    // img
+    lv_obj_t * img = lv_img_create(content, NULL);
+       lv_img_set_src(img, ICON_VIDEO_CALL_CONTACT_PHOTO);
+       lv_obj_align(img, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
+    lv_obj_set_click(img, false);
+
+    // name
+    label = lv_label_create(content, NULL);
+    lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+    lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+       lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL);
+       lv_obj_set_width(label, lv_obj_get_width(content) - 20);
+    if(strlen(s_video_call_params.name) > 0) 
+       {
+        lv_label_set_text(label, s_video_call_params.name);
+    } 
+       else 
+       {
+        lv_label_set_text(label, s_video_call_params.number);
+    }
+       lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
+    lv_obj_set_click(label, false);
+
+    // btn ring off
+    lv_obj_t * btn;
+    btn = lv_imgbtn_create(content, NULL);
+    lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN);
+    lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN);
+    lv_obj_set_event_cb(btn, mmi_vc_ring_off_action);
+    lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_LEFT, MMI_VC_INCOMING_RING_OFF_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+
+    // btn ring hook
+    btn = lv_imgbtn_create(content, NULL);
+    lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_ANSWER_BTN);
+    lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_ANSWER_BTN);
+    lv_obj_set_event_cb(btn, mmi_vc_hook_action);
+    lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_VC_INCOMING_HOOK_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+}
+
+static void mmi_vc_ui_connecting(lv_obj_t * content)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+       lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+
+       LV_ASSERT_MEM(ext);
+       if(ext == NULL) {
+               return;
+       }
+       lv_obj_t * label;
+
+       // label ringing
+       label = lv_label_create(content, NULL);
+       lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20);
+       lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+       lv_label_set_text_id(label, WATCH_TEXT_ID_CONNECTING);
+       lv_obj_set_click(label, false);
+       lv_obj_align(label, content, LV_ALIGN_IN_TOP_MID, 0, 10);
+       ext->phone_status_label = label;
+
+       // img
+       lv_obj_t * img = lv_img_create(content, NULL);
+       lv_img_set_src(img, ICON_VIDEO_CALL_CONTACT_PHOTO);
+       lv_obj_align(img, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
+       lv_obj_set_click(img, false);
+
+       // name
+       label = lv_label_create(content, NULL);
+       lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+       lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+       lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL);
+       lv_obj_set_width(label, lv_obj_get_width(content) - 20);
+       if(strlen(s_video_call_params.name) > 0) 
+       {
+               lv_label_set_text(label, s_video_call_params.name);
+       } 
+       else 
+       {
+               lv_label_set_text(label, s_video_call_params.number);
+       }
+       lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
+       lv_obj_set_click(label, false);
+
+    // btn ring off
+    lv_obj_t * btn = lv_imgbtn_create(content, NULL);
+    lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN);
+    lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN);
+    lv_obj_set_event_cb(btn, mmi_vc_ring_off_action);
+    lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_MID, 0, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+}
+
+static void mmi_vc_ui_connected(lv_obj_t * content)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+    lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+    if(ext == NULL) 
+       {
+        return;
+    }
+
+       lv_obj_t * label;
+       lv_obj_t * btn;
+       hal_rtc_t rtc_curr = {0};                                  // current rtc time
+       Hal_Rtc_Gettime(&rtc_curr);
+       
+    if(s_video_call_params.call_type == MODEM_VIDEO_CALL_TYPE_VOICE) 
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               
+        ext->connect_start_time = time_to_seconds(&rtc_curr);
+
+               ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_NULL;
+
+        //lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
+        lv_obj_t * img = lv_img_create(content, NULL);
+               lv_img_set_src(img, ICON_VIDEO_CALL_CONTACT_PHOTO);
+               lv_obj_align(img, content, LV_ALIGN_IN_TOP_MID, 0, 30);
+               lv_obj_set_click(img, false);
+               
+        // name
+               label = lv_label_create(content, NULL);
+               lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+               lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+               lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL);
+               lv_obj_set_width(label, lv_obj_get_width(content) - 20);
+               if(strlen(s_video_call_params.name) > 0) 
+               {
+                       lv_label_set_text(label, s_video_call_params.name);
+               } 
+               else 
+               {
+                       lv_label_set_text(label, s_video_call_params.number);
+               }
+               lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
+               lv_obj_set_click(label, false);
+
+               //duration
+               lv_obj_t * time_label = lv_label_create(content, NULL);
+               lv_obj_add_style(time_label, LV_OBJ_PART_MAIN, &lv_watch_font20);
+               lv_label_set_align(time_label, LV_LABEL_ALIGN_CENTER);
+               lv_label_set_text(time_label, "00:00");
+               lv_obj_set_click(time_label, false);
+               lv_obj_set_base_dir(time_label, LV_BIDI_DIR_LTR);
+               lv_obj_align(time_label, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
+               ext->phone_status_label = time_label;
+
+               //btn volume
+               btn = lv_imgbtn_create(content, NULL);
+               lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VOLUME_BTN);
+               lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VOLUME_BTN);
+               lv_obj_set_event_cb(btn, voip_volume_btn_action);
+               lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_LEFT, MMI_VC_CALLING_VOLUME_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET); //20, -50);
+
+               //btn ring off
+               btn = lv_imgbtn_create(content, NULL);
+               lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN);
+               lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN);
+               lv_obj_set_event_cb(btn, mmi_vc_ring_off_action);
+               lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_VC_CALLING_RING_OFF_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET); //-20, -50);
+    } 
+       else
+       {
+        lv_obj_t * canvas;
+
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: format=%d\n", __FUNCTION__, __LINE__, ext->voiph263fmt);
+
+        ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_REMOTE;
+        if((ext->voiph263fmt == VOIP_H263_FMT_SQCIF) || (ext->voiph263fmt == VOIP_H263_FMT_QCIF)) 
+               {
+            ext->connect_start_time = time_to_seconds(&rtc_curr);
+
+            /*Create the canvas object*/
+            canvas = lv_canvas_create(content, NULL);
+            lv_obj_set_click(canvas, true);
+            lv_obj_set_event_cb(canvas, canvas_button_hidden_event_cb);
+            video_call_add_element(canvas);
+            ext->canvas = canvas;
+
+            lv_obj_align(canvas, content, LV_ALIGN_IN_TOP_MID, 0, 0);
+            /*Assign the buffer to the canvas*/
+            lv_img_set_src(canvas, ICON_BACKGROUND);
+            voip_signal_check_start(ext);
+
+            // duration
+            label = lv_label_create(canvas, NULL);
+            lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20);
+            lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+            lv_label_set_text(label, "0:0");
+            lv_obj_set_click(label, false);
+            lv_obj_set_base_dir(label, LV_BIDI_DIR_LTR);
+                       lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 0);
+            ext->phone_status_label = label;
+
+            // signal weak notification
+            label = lv_label_create(canvas, NULL);
+            lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+            lv_label_set_text_id(label, WATCH_TEXT_ID_SIGNAL_WEAK);
+            lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+            lv_obj_align(label, canvas, LV_ALIGN_CENTER, 0, -10);
+            lv_obj_set_click(label, false);
+            lv_obj_set_hidden(label, true);
+            ext->signal_weak_label = label;
+
+            // btn volume
+            btn = lv_imgbtn_create(canvas, NULL);
+            lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VOLUME_BTN);
+            lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VOLUME_BTN);
+            lv_obj_set_event_cb(btn, voip_volume_btn_action);
+            lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_LEFT, MMI_VC_CALLING_VOLUME_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+
+            // btn switch video
+            //btn = lv_imgbtn_create(canvas, NULL);
+            //lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_SETTING_VOLTE);
+            //lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_SETTING_VOLTE);
+            //lv_obj_set_event_cb(btn, voip_local_remote_switch_action);
+            //lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
+
+            // btn ring off
+            btn = lv_imgbtn_create(canvas, NULL);
+            lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN);
+            lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN);
+            lv_obj_set_event_cb(btn, mmi_vc_ring_off_action);
+            lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_VC_CALLING_RING_OFF_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET);           
+        } 
+               else if((ext->voiph263fmt == VOIP_H263_FMT_CIF)
+                  || (ext->voiph263fmt == VOIP_H263_FMT_4CIF)
+                  || (ext->voiph263fmt == VOIP_H263_FMT_16CIF)
+                  || (ext->voiph263fmt == VOIP_H263_FMT_OTHER)) 
+               {
+            /*Create the canvas object*/
+            canvas = lv_canvas_create(content, NULL);
+            lv_obj_set_click(canvas, true);
+            lv_obj_set_event_cb(canvas, canvas_button_hidden_event_cb);
+            video_call_add_element(canvas);
+            ext->canvas = canvas;
+
+            /*Assign the buffer to the canvas*/
+            lv_img_set_src(canvas, ICON_BACKGROUND);
+            voip_signal_check_start(ext);
+
+            // duration
+            label = lv_label_create(canvas, NULL);
+            lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20);
+            lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+            lv_label_set_text(label, "0:0");
+            lv_obj_set_click(label, false);
+            lv_obj_set_base_dir(label, LV_BIDI_DIR_LTR);
+                       lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 0);
+            ext->phone_status_label = label;
+            ext->connect_time       = label;
+
+            // signal weak notification
+            label = lv_label_create(canvas, NULL);
+            lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+            lv_label_set_text_id(label, WATCH_TEXT_ID_SIGNAL_WEAK);
+            lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+            lv_obj_align(label, canvas, LV_ALIGN_CENTER, 0, -10);
+            lv_obj_set_click(label, false);
+            lv_obj_set_hidden(label, true);
+            ext->signal_weak_label = label;
+
+            // btn volume
+            btn = lv_imgbtn_create(canvas, NULL);
+            lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VOLUME_BTN);
+            lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VOLUME_BTN);
+            lv_obj_set_event_cb(btn, voip_volume_btn_action);
+            lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_LEFT, MMI_VC_CALLING_VOLUME_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+            lv_obj_add_style(btn, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
+            ext->volume_button = btn;
+
+            // btn switch video
+            btn = lv_imgbtn_create(canvas, NULL);
+            //lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_SETTING_VOLTE);
+            //lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_SETTING_VOLTE);
+            //lv_obj_set_event_cb(btn, voip_local_remote_switch_action);
+            //lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_MID, 0, -20);
+            //lv_obj_add_style(btn, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
+            ext->view_switch_button = btn;     
+
+            // btn ring off
+            btn = lv_imgbtn_create(canvas, NULL);
+            lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN);
+            lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN);
+            lv_obj_set_event_cb(btn, mmi_vc_ring_off_action);
+            lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_VC_CALLING_RING_OFF_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+            lv_obj_add_style(btn, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
+            ext->ring_off_button = btn;
+
+            lv_obj_set_hidden(ext->connect_time, ext->canvas_button_hidden_flag);
+            lv_obj_set_hidden(ext->volume_button, ext->canvas_button_hidden_flag);
+                       lv_obj_set_hidden(ext->view_switch_button, true); // lv_obj_set_hidden(ext->view_switch_button, ext->canvas_button_hidden_flag);
+            lv_obj_set_hidden(ext->ring_off_button, ext->canvas_button_hidden_flag);
+        }
+
+        if(mmi_vc_call_get_obj()) {
+            lv_watch_obj_set_down_slide_cb(mmi_vc_call_get_obj(), voip_phone_down_slide_callback);
+        }
+    }
+}
+
+static lv_obj_t * mmi_vc_ui_create(lv_obj_t * activity_obj)
+{
+    if(MMI_VC_UI_CONNECTED == s_vc_call_ui) 
+       {
+        /* set speaker volume to nv when leaving activiry's slider */
+        voip_set_volume_when_slider_act();
+    }
+
+    mmi_vc_call_screen_clean();
+
+    //lv_watch_png_cache_all_free();
+       
+    if(activity_obj == NULL) 
+       {
+        lv_watch_activity_ext_t activity_ext = {0};
+
+        activity_ext.actId           = ACT_ID_VOIPPHONE;
+        activity_ext.create          = NULL; // mmi_vc_ui_create;
+        activity_ext.prepare_destory = mmi_vc_ui_prepare_destory;
+        activity_obj = lv_watch_creat_activity_obj(&activity_ext);
+        if(NULL == activity_obj) 
+               {
+            return NULL;
+        }
+    }
+
+    lv_obj_t * obj = lv_watch_obj_create(activity_obj);
+    if(obj == NULL)
+       {
+        return NULL;
+    }
+    lv_watch_obj_set_anim_mode(obj, LV_WATCH_LEFT_OR_RIGHT_SLIDE_CALLBACK);
+    lv_watch_obj_set_left_slide_cb(obj, voip_phone_left_slide_callback);
+    lv_watch_obj_set_right_slide_cb(obj, voip_phone_right_slide_callback);
+
+    lv_vc_call_obj_ext_t * ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_vc_call_obj_ext_t));
+    if(ext == NULL) 
+       {
+        return NULL;
+    }
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    ext->phone_status_label       = NULL;
+    ext->phone_animation_obj      = NULL;
+    ext->vc_ui = s_vc_call_ui;
+    ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_NULL;
+#if ENABLE_VIDEO_SCALE == 0
+    ext->voiph263fmt = VOIP_H263_FMT_QCIF;
+#else
+    ext->voiph263fmt = VOIP_H263_FMT_OTHER;
+#endif
+
+    hal_rtc_t rtc_curr;            // current rtc time
+    Hal_Rtc_Gettime(&rtc_curr);
+    ext->connect_start_time = time_to_seconds(&rtc_curr);
+    ext->connect_time = NULL;
+    ext->volume_button = NULL;
+    ext->view_switch_button = NULL;
+    ext->ring_off_button = NULL;
+    ext->canvas_button_hidden_flag = NOT_HIDDEN;
+
+    /* content */
+    lv_obj_t * content = lv_cont_create(obj, NULL);
+    lv_obj_set_size(content, lv_obj_get_width(obj), lv_obj_get_height(obj));
+    //lv_cont_set_layout(content, LV_LAYOUT_COLUMN_MID);
+    lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
+       //lv_obj_set_style_local_bg_color(content, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_watch_obj_add_element(content);
+    lv_obj_set_click(content, false);
+    lv_obj_align(content, obj, LV_ALIGN_CENTER, 0, 0);
+
+       switch(ext->vc_ui)
+       {
+               case MMI_VC_UI_INCOMING:
+                       mmi_vc_ui_incoming(content);
+                       //mmi_vc_ring_animation(ext->phone_status_label);
+                       break;
+                       
+               case MMI_VC_UI_DIALING:
+                       mmi_vc_ui_dialing(content);
+                       //mmi_vc_dialing_animation(ext->phone_status_label);
+                       break;
+                       
+               case MMI_VC_UI_CONNECTING:
+                       mmi_vc_ui_connecting(content);
+                       //mmi_vc_connecting_animation(ext->phone_status_label);
+                       break;
+                       
+               case MMI_VC_UI_CONNECTED:
+               mmi_vc_ui_connected(content);
+               mmi_vc_connected_animation(ext->phone_status_label);
+                       break;
+
+               default:
+                       break;
+       }
+
+    return obj;
+}
+
+void mmi_ui_msg_update_vc_call_incoming(void)
+{
+       s_vc_call_ui = MMI_VC_UI_INCOMING;
+       mmi_vc_ui_create(NULL);
+}
+
+void mmi_vc_call_action_incoming(char * number, MODEM_VIDEO_CALL_TYPE type, char * t_ticket, char * t_tokens)
+{
+       if(true == mmi_active_screen_is_prohibit_interrupted() || true == is_rat_gsm())
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               
+        mmi_video_call_reject_req(TRUE);
+        return;
+    }
+
+    if(AUDIO_CTRL_PRIORITY_2 == Hal_Audio_Manage_Start_Req(AUDIO_CTRL_PRIORITY_2, mmi_vc_audio_ctrl_callback))
+    {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               
+               Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+               s_video_call_params.call_type = type;
+               s_video_call_params.state = MMI_VIDEO_CALL_STATE_INCOMING;
+               strncpy(s_video_call_params.number, number, NV_WATCH_VC_CONTACT_NUMBER_LEN - 1);
+
+               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);
+               
+               HAL_SPEAKER_GAIN volume = query_current_volume();
+               if(!Hal_Set_BT_Audio_Path(volume))
+               {
+                       Hal_Call_Speaker(HAL_CALL_SPK_ON, volume);
+               }
+        Hal_NFFS_File_Play_Repeat(AUDIO_INCOMING_CALL, volume);
+
+
+               //
+               mmi_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();
+    }
+    else
+    { 
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__);
+               
+        // auto reject
+        mmi_video_call_reject_req(FALSE);
+        voip_signal_check_stop();
+        voip_rat_check_stop();
+
+        // stop ring off timer
+        mmi_vc_ring_off_timer_stop();
+
+        // stop callreq timer
+        mmi_vc_dialing_timer_stop();
+
+        Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+        voip_set_volume_when_slider_act();
+        mmi_vc_call_screen_clean();
+        lv_watch_png_cache_all_free();
+        Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
+    }
+}
+
+static void mmi_vc_call_connecting_timeout_cb(void * para)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    mmi_vc_connecting_timer_stop();
+    mmi_video_call_hangup_req(TRUE);
+       //mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);
+}
+
+void mmi_vc_call_action_connecting(void)
+{
+       if(MMI_VIDEO_CALL_STATE_CALLING == s_video_call_params.state
+               || MMI_VIDEO_CALL_STATE_CONNECTING == s_video_call_params.state
+               )
+       {
+               return;
+       }
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+       s_video_call_params.state = MMI_VIDEO_CALL_STATE_CONNECTING;
+
+       // stop timer
+       mmi_vc_dialing_timer_stop();
+    mmi_vc_connecting_timer_stop();
+
+       // stop playing tone
+       Hal_Tone_Play_End();
+
+       //Hal_Set_Voice_Call_Status(VOICE_CALL_START);
+
+       if(NULL == s_video_call_params.connecting_timer_id) 
+       {
+               s_video_call_params.connecting_timer_id = Hal_Timer_Start(MMI_VC_CONNECTING_TIMEOUT, mmi_vc_call_connecting_timeout_cb, NULL, 0);
+       }
+
+       s_vc_call_ui = MMI_VC_UI_CONNECTING;
+       mmi_vc_ui_create(NULL);
+}
+
+void mmi_vc_call_action_connected(void)
+{
+    if(MMI_VIDEO_CALL_STATE_CALLING == s_video_call_params.state)
+       {
+        return;
+    }
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+    s_video_call_params.state = MMI_VIDEO_CALL_STATE_CALLING;
+
+    // stop timer
+    mmi_vc_dialing_timer_stop();
+       mmi_vc_connecting_timer_stop();
+
+    // stop playing tone
+    Hal_Tone_Play_End();
+
+    Hal_Set_Voice_Call_Status(VOICE_CALL_START);
+
+       s_vc_call_ui = MMI_VC_UI_CONNECTED;
+       mmi_vc_ui_create(NULL);
+}
+
+static void mmi_vc_call_dialing_timeout_cb(void * para)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    mmi_vc_dialing_timer_stop();
+    mmi_video_call_hangup_req(TRUE);
+}
+
+void mmi_vc_call_action_dialing_ext(char * t_tokens, char * t_ticket)
+{
+       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_ring_off_timer_stop();
+    mmi_vc_dialing_timer_stop();
+
+    Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+    s_video_call_params.state = MMI_VIDEO_CALL_STATE_DIALING;
+    s_video_call_params.call_type = type;
+    strcpy(s_video_call_params.number, number);
+       
+       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_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_check_mo_permission())
+       {
+               uint8_t index = lv_watch_get_free_num(btn);
+
+               mmi_vc_call_action_dialing(s_vc_contact.number[index], MODEM_VIDEO_CALL_TYPE_VOICE);
+    } 
+       else 
+       {
+        mmi_vc_call_action_no_permission();
+    }
+}
+
+static void mmi_vc_video_btn_action(lv_obj_t * btn, lv_event_t e)
+{
+    if(LV_EVENT_CLICKED != e)
+       {
+        return;
+    }
+
+    if(true == mmi_vc_check_mo_permission()) 
+       {
+               uint8_t index = lv_watch_get_free_num(btn);
+
+               mmi_vc_call_action_dialing(s_vc_contact.number[index], MODEM_VIDEO_CALL_TYPE_VIDEO);
+    } 
+       else 
+       {
+        mmi_vc_call_action_no_permission();
+    }
+}
+
+static void mmi_vc_dial_btn_screen(lv_obj_t * btn, lv_event_t e)
+{
+    if(LV_EVENT_CLICKED != e)
+       {
+        return;
+    }
+
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    lv_obj_t * obj = lv_watch_get_activity_obj(ACT_ID_VOIP_PHONEBOOK);
+       uint8_t index = lv_watch_get_free_num(btn);
+       
+       lv_obj_t * cont = lv_cont_create(obj, NULL);
+       lv_cont_set_fit(cont, LV_FIT_NONE);
+       lv_obj_set_size(cont, LV_HOR_RES, LV_VER_RES); // lv_obj_get_width(obj), lv_obj_get_height(obj));
+       lv_obj_set_style_local_bg_color(cont, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_cont_set_layout(cont, LV_LAYOUT_OFF);
+       lv_obj_set_click(cont, false);
+
+       lv_obj_t * voicebtn = lv_imgbtn_create(cont, NULL);
+       lv_imgbtn_set_src(voicebtn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VOICE_BTN);
+       lv_imgbtn_set_src(voicebtn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VOICE_BTN);
+       lv_obj_align(voicebtn, cont, LV_ALIGN_IN_TOP_MID, 0, 10);
+       lv_obj_set_event_cb(voicebtn, mmi_vc_voice_btn_action);
+       lv_watch_set_free_num(voicebtn, index);
+       
+       lv_obj_t * videobtn = lv_imgbtn_create(cont, NULL);
+       lv_imgbtn_set_src(videobtn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VIDEO_BTN);
+       lv_imgbtn_set_src(videobtn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VIDEO_BTN);
+       lv_obj_align(videobtn, cont, LV_ALIGN_IN_BOTTOM_MID, 0, -10);
+       lv_obj_set_event_cb(videobtn, mmi_vc_video_btn_action);
+       lv_watch_set_free_num(videobtn, index);
+}
+
+static lv_obj_t * mmi_vc_contact_list_create(lv_obj_t * obj)
+{
+       /*Allocate the object type specific extended data*/
+       lv_vc_contact_list_obj_ext_t * ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_vc_contact_list_obj_ext_t));
+       /*ext realloc based on watch_obj_ext, do not memeset it*/
+       if(NULL == ext)
+       {
+               return NULL;
+       }
+
+       ext->title = NULL;
+       ext->list = NULL;
+
+       /* content */
+       lv_obj_t * content = lv_cont_create(obj, NULL);
+       lv_cont_set_fit(content, LV_FIT_NONE);
+       lv_obj_set_size(content, lv_obj_get_width(obj), lv_obj_get_height(obj));
+       lv_obj_add_style(content,LV_OBJ_PART_MAIN, &lv_watch_style_transp);
+       lv_obj_set_style_local_bg_color(content, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_cont_set_layout(content, LV_LAYOUT_OFF); // lv_cont_set_layout(content, LV_LAYOUT_COLUMN_MID);
+       lv_obj_set_click(content, false);
+       lv_obj_align(content, obj, LV_ALIGN_CENTER, 0, 0);
+
+       lv_obj_t * label = lv_label_create(content, NULL);
+       lv_obj_set_size(label, LV_HOR_RES, 40); // 30);
+       lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font20_gray);
+       lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+       lv_label_set_text_id(label, WATCH_TEXT_ID_VIDEOCALL);
+       lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 5);
+       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, t_str);
+               lv_page_glue_obj(btn, true);
+               //lv_obj_add_protect(btn, LV_PROTECT_PRESS_LOST);
+               lv_obj_set_event_cb(btn, mmi_vc_dial_btn_screen);
+               lv_watch_obj_add_element(btn);
+
+               lv_obj_set_style_local_bg_color(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+               lv_obj_set_style_local_pad_top(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 6);
+               lv_obj_set_style_local_pad_bottom(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 6);
+               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);
+
+               //lv_obj_set_size(btn, lv_obj_get_width(list), 80); //56);
+
+               //label = lv_obj_get_child(btn, NULL);
+               //label = lv_list_get_btn_label(btn);
+               //lv_label_set_long_mode(label, LV_LABEL_LONG_EXPAND);
+               //lv_label_set_text(label, t_str);
+               //lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+               //lv_obj_align(label, btn, LV_ALIGN_IN_LEFT_MID, 0, 0);
+       #else
+       
+               btn = lv_list_add_btn(list, NULL, NULL);
+               //lv_page_glue_obj(btn, true);
+               //lv_obj_add_protect(btn, LV_PROTECT_PRESS_LOST);
+               lv_obj_set_event_cb(btn, mmi_vc_dial_btn_screen);
+               lv_watch_obj_add_element(btn);
+               
+               lv_obj_set_style_local_bg_color(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+               lv_obj_set_style_local_pad_top(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 5);
+               lv_obj_set_style_local_pad_bottom(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 5);
+               lv_obj_set_style_local_pad_left(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 15);
+               lv_obj_set_style_local_pad_right(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 15);
+               lv_obj_set_style_local_pad_inner(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 10);
+               
+               //label = lv_obj_get_child(btn, NULL);
+               //label = lv_list_get_btn_label(btn);
+               label = lv_label_create(btn, NULL);
+        //lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL); // LV_LABEL_LONG_SROLL_CIRC
+               lv_obj_set_width(label, lv_obj_get_width(btn));
+               lv_label_set_text(label, t_str);
+               lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+               lv_label_set_align(label, LV_LABEL_ALIGN_LEFT);
+        lv_obj_set_click(label, false);
+               //lv_obj_align(label, btn, LV_ALIGN_IN_LEFT_MID, 0, 0);
+       #endif
+               
+               lv_watch_set_free_num(btn, i);
+       }
+
+       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_NO_SIM_OR_NETWORK); // WATCH_TEXT_ID_NO_CONTACTS_OR_NETWORK);
+               lv_obj_align(label, obj, LV_ALIGN_CENTER, 0, 0);
+    } 
+       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, 0);
+       }
+       else
+       {
+               VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               
+               mmi_vc_contact_list_create(obj);
+    }
+
+    return(obj);
+}
+
+void video_call_create_event_cb(lv_obj_t * btn, lv_event_t e)
+{
+#ifdef __VIDEO_CALL_TEST__
+       nv_watch_vc_contact_t t_test_contact = 
+               {
+                       3,
+                       {"test001", "test002", "test003"},
+                       {"jrtc001", "jrtc002", "jrtc003"}
+               };
+
+       _lv_memcpy(&s_vc_contact, &t_test_contact, sizeof(nv_watch_vc_contact_t));
+#endif
+
+    if(LV_EVENT_CLICKED == e) 
+       {               
+        lv_watch_png_cache_all_free();
+        mmi_vc_main_create(NULL);
+    }
+    else if(LV_EVENT_LONG_PRESSED == e)
+       {
+
+       }
+}
+
+
+//interface
+uint8_t mmi_vc_get_call_volume_fzd(void)
+{
+    return(s_video_call_params.speaker_volume);
+}
+
+bool mmi_vc_watch_suspend_check_fzd(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_fzd(void)
+{
+    if(mmi_vc_call_get_activity_obj()) 
+       {
+        return true;
+    }
+
+       return false;
+}
+
+void mmi_vc_activity_destroy_req_fzd(void)
+{
+       VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+    lv_obj_t * activity_obj = mmi_vc_call_get_activity_obj();
+    if(NULL == activity_obj) 
+       {
+        return;
+    }
+
+    switch(s_video_call_params.state) 
+       {
+        case MMI_VIDEO_CALL_STATE_NONE:
+        case MMI_VIDEO_CALL_STATE_INVALID:
+            // do noting
+            break;
+
+        case MMI_VIDEO_CALL_STATE_CALLING:
+            mmi_video_call_hangup_req(FALSE);
+            break;
+
+        case MMI_VIDEO_CALL_STATE_INCOMING:
+            Hal_Tone_Play_End();
+            mmi_video_call_reject_req(FALSE);
+            break;
+
+        default:
+            mmi_video_call_hangup_req(FALSE);
+            break;
+    }
+
+    voip_signal_check_stop();
+    voip_rat_check_stop();
+
+    // stop timer
+    mmi_vc_ring_off_timer_stop();
+    mmi_vc_dialing_timer_stop();
+    mmi_vc_connecting_timer_stop();
+
+    Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+    voip_set_volume_when_slider_act();
+    mmi_vc_call_screen_clean();
+    lv_watch_png_cache_all_free();
+}
+
+#endif
+#endif
+
+
diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_fzd.h b/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_fzd.h
new file mode 100644 (file)
index 0000000..968f94e
--- /dev/null
@@ -0,0 +1,241 @@
+
+
+
+#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
+
+#if 0
+void voip_alarm_ind(void);
+#endif
+
+
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__
+
+
+#define __VIDEO_CALL_DEBUG__
+#ifdef __VIDEO_CALL_DEBUG__
+#define VIDEO_CALL_DEBUG_PRINTF(fmt, ...)      printf("[VIDEO_CALL]"fmt, ##__VA_ARGS__)
+#else
+#define VIDEO_CALL_DEBUG_PRINTF(fmt, ...)
+#endif
+
+//#define __VIDEO_CALL_TEST__
+
+
+
+#define ENABLE_VIDEO_SCALE  1
+
+#define VOIP_PHONE_RING_OFF_ANIMATION_TIME 0
+#define VOIP_PHONE_RING_OFF_CONTINUE_TIME 1500   /*ms*/
+
+#define LV_COLOR_HEX3(c) LV_COLOR_MAKE((uint8_t) (((c >> 4) & 0xF0) | ((c >> 8) & 0xF)),   \
+                                (uint8_t) ((uint32_t)(c & 0xF0)     | ((c & 0xF0) >> 4)), \
+                                (uint8_t) ((uint32_t)(c & 0xF)      | ((c & 0xF) << 4)))
+#define H263_FMT_QCIF 1
+#if H263_FMT_QCIF == 1
+#define VIDEO_SOURCE_WIDTH   176
+#define VIDEO_SOURCE_HEIGHT  144
+#endif
+
+#if (ENABLE_VIDEO_SCALE==0)
+#define canvas_width  VIDEO_SOURCE_WIDTH
+#define canvas_heigh  VIDEO_SOURCE_HEIGHT
+#else
+#define canvas_width  LV_HOR_RES   /* 240 */
+#define canvas_heigh  LV_VER_RES   /* 240 */
+#endif
+
+#define VIDEO_RENDER_PERIOD  50   /* 1000/50=20fps */
+#define VIDEO_SIGNAL_CHECK  0
+#define VIDEO_SIGNAL_CHECK_PERIOD  1000
+#define VIDEO_RAT_CHECK_PERIOD  200
+#define VIDEO_CALL_FPS_CHECK_LIMIT 5
+
+#define MMI_VC_DIALING_TIMEOUT    (60*1000)
+#define MMI_VC_CONNECTING_TIMEOUT    (30*1000)
+
+#if USE_LV_WATCH_UI_240_320
+#define MMI_VC_RING_OFF_BTN_Y_OFFSET (-30)
+#define MMI_VC_INCOMING_RING_OFF_BTN_X_OFFSET (20)
+#define MMI_VC_INCOMING_HOOK_BTN_X_OFFSET (-20)
+
+#define MMI_VC_CALLING_RING_OFF_BTN_X_OFFSET (-20)
+#define MMI_VC_CALLING_VOLUME_BTN_X_OFFSET (20)
+
+#elif USE_LV_WATCH_UI_240_280
+#define MMI_VC_RING_OFF_BTN_Y_OFFSET (-15)
+#define MMI_VC_INCOMING_RING_OFF_BTN_X_OFFSET (20)
+#define MMI_VC_INCOMING_HOOK_BTN_X_OFFSET (-20)
+
+#define MMI_VC_CALLING_RING_OFF_BTN_X_OFFSET (-20)
+#define MMI_VC_CALLING_VOLUME_BTN_X_OFFSET (20)
+
+#else
+
+
+#endif
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/** H.263 picture size format */
+enum voip_h263_fmt {
+    VOIP_H263_FMT_SQCIF = 1, /**<  128 x 96  */
+    VOIP_H263_FMT_QCIF  = 2, /**<  176 x 144  */
+    VOIP_H263_FMT_CIF   = 3, /**<  352 x 288  */
+    VOIP_H263_FMT_4CIF  = 4, /**<  704 x 576  */
+    VOIP_H263_FMT_16CIF = 5, /**< 1408 x 1152 */
+    VOIP_H263_FMT_OTHER = 7,
+};
+
+enum local_remote_switch_e {
+    VOIP_REMOTE_SWITCH_REMOTE = 0,
+    VOIP_REMOTE_SWITCH_LOCAL,
+    VOIP_REMOTE_SWITCH_NULL,
+};
+
+enum enum_canvas_button_hidden_flag
+{
+    NOT_HIDDEN,
+    HIDDEN
+};
+
+
+typedef struct {
+    lv_watch_obj_ext_t lv_watch_obj;
+    /*New data for this type */
+    lv_obj_t * title;
+    lv_obj_t * list;
+} lv_vc_contact_list_obj_ext_t;
+
+typedef enum 
+{
+    MMI_VC_UI_INCOMING = 0,
+    MMI_VC_UI_DIALING,
+       MMI_VC_UI_CONNECTING,
+    MMI_VC_UI_CONNECTED,
+       MMI_VC_UI_INVALID,
+} MMI_VIDEO_CALL_UI_E;
+
+typedef enum
+{
+       MMI_VIDEO_CALL_STATE_NONE,
+       MMI_VIDEO_CALL_STATE_CALLING,
+       MMI_VIDEO_CALL_STATE_INCOMING,
+       MMI_VIDEO_CALL_STATE_DIALING,
+       MMI_VIDEO_CALL_STATE_CONNECTING,
+       MMI_VIDEO_CALL_STATE_INVALID,
+}MMI_VIDEO_CALL_STATE_E;
+
+
+#define VOIP_RING_OFF_TIMER_LEN    1000
+
+typedef struct {
+    MMI_VIDEO_CALL_STATE_E state;
+    //int32_t              index;                    /* Connection Index for use with, eg, AT+CHLD */
+    //bool                 is_mt;                    /* true if MT call */
+    bool                 ring_off;                 /* true if ring off by user */
+    bool                 ring_off_timeout;         /* true if ring off timeout */
+    TIMER_ID             ring_off_timer_id;        /* ring off timer */
+    char                 number[NV_WATCH_VC_CONTACT_NUMBER_LEN];   /* phone number */
+    char                 name[NV_WATCH_VC_CONTACT_NAME_LEN];       /* contact name */
+    //const void * img_src;
+    //const void * img_src_small;
+    MODEM_VIDEO_CALL_TYPE call_type;
+    TIMER_ID dialing_timer_id;
+       TIMER_ID connecting_timer_id;
+    uint8_t speaker_volume;           /* speaker volume during call procedure */
+} MMI_VIDEO_CALL_PARAMS_T;
+
+typedef struct {
+    lv_watch_obj_ext_t lv_watch_obj;
+
+       /*New data for this type */
+    lv_obj_t * phone_status_label;
+    lv_obj_t * phone_animation_obj;
+    uint32_t connect_start_time;
+    MMI_VIDEO_CALL_UI_E vc_ui;
+    enum local_remote_switch_e local_remote_switch_flag;
+    enum voip_h263_fmt voiph263fmt;
+    lv_obj_t * connect_time;
+    lv_obj_t * volume_button;
+    lv_obj_t * view_switch_button;
+    lv_obj_t * ring_off_button;
+    enum enum_canvas_button_hidden_flag canvas_button_hidden_flag;
+    lv_obj_t * signal_weak_label;
+    lv_obj_t * canvas;
+}lv_vc_call_obj_ext_t;
+
+
+#define MMI_WATCH_VC_TICKET_LEN  (64 + 1)
+#define MMI_WATCH_VC_TOKENS_LEN  (128 + 1)
+
+
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+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_ring_off_no_carrier(uint8_t isNoCarrier);
+void mmi_vc_call_action_dialing(char * number, MODEM_VIDEO_CALL_TYPE type);
+void mmi_vc_call_action_incoming(char * number, MODEM_VIDEO_CALL_TYPE type, 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);
+
+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);
+
+
+void video_call_create_event_cb(lv_obj_t *btn, lv_event_t e);
+
+
+bool mmi_vc_connect_check_req_fzd(void);
+bool mmi_vc_watch_suspend_check_fzd(void);
+void mmi_vc_activity_destroy_req_fzd(void);
+uint8_t mmi_vc_get_call_volume_fzd(void);
+
+
+#endif
+#endif
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*VIDEOCALL_H*/