From: @CHENG <2393524978@qq.com> Date: Wed, 15 May 2024 07:10:59 +0000 (+0800) Subject: gengxin X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=c74c1ca790eeecbf04bd8a18d2dd8514740e18e1;p=mirrors%2FASR3603_Z5_DS.git gengxin --- diff --git a/2.sdk/project/C55_DS_D11G_DT_HZCH/product/craneg_modem/config/watch/lv_watch_conf_CUSTOM.h b/2.sdk/project/C55_DS_D11G_DT_HZCH/product/craneg_modem/config/watch/lv_watch_conf_CUSTOM.h index 2ef28938..5cd98beb 100644 --- a/2.sdk/project/C55_DS_D11G_DT_HZCH/product/craneg_modem/config/watch/lv_watch_conf_CUSTOM.h +++ b/2.sdk/project/C55_DS_D11G_DT_HZCH/product/craneg_modem/config/watch/lv_watch_conf_CUSTOM.h @@ -48,9 +48,9 @@ #define USE_LV_WATCH_FACTORY_MODE 1 #define USE_LV_WATCH_VOICE_MSG 0 // 1 #define USE_LV_WATCH_RESTART_AND_RESET 1 -#define USE_LV_WATCH_CAMERA 1 +#define USE_LV_WATCH_CAMERA 0 // 1 #define USE_LV_WATCH_SPEECH_RECOG 0 // 1 -#define USE_LV_WATCH_ALBUM 1 +#define USE_LV_WATCH_ALBUM 0 // 1 #define USE_LV_WATCH_ENGINEER_MODE 1 #define USE_LV_WATCH_CTA 1 #define USE_LV_WATCH_VOLTE_SWTICH 0 // 1 @@ -162,7 +162,7 @@ #endif #define __MMI_ZHSX_SUPPORT_VIDEO_CALL__ -#define __MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__ +#define __MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__ //#define __MMI_WECHAT_SUPPORT__ //#define __MMI_WECHAT_RECEIVE_AUDIO_USE_MP3__ diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_jrtc_client_hzch.c b/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_jrtc_client_hzch.c new file mode 100644 index 00000000..e944476b --- /dev/null +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_jrtc_client_hzch.c @@ -0,0 +1,570 @@ + + + +#include "lv_watch.h" + +#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__ + +#if 1 + +typedef enum jrtc_state video_call_jrtc_state_e; +typedef enum jrtc_error video_call_jrtc_error_e; +typedef struct jrtc_image_t video_call_jrtc_image_t; + +typedef struct +{ + void /*lv_task_t*/ *state_task; + video_call_jrtc_image_t txframe; + video_call_jrtc_image_t rxframe; + void* jrtc_ptr; + TIMER_ID closed_timer_id; + uint8_t closing; +} MMI_VIDEO_CALL_JRTC_T; + + +static MMI_VIDEO_CALL_JRTC_T s_video_call_jrtc; + + +static uint8_t voip_jrtc_get_image(void * preview_buf); + +extern UINT32 OsaGetTicks(void *pForFutureUse); + + +void mmi_video_call_jrtc_config_init_00(void) +{ +#ifdef __VIDEO_CALL_TEST__ + char appkey[24+1] = "dc1db81c19d1da4f5fb4a197"; + char key[16+1] = "K75A1vS562671d38"; + char uid[64+1] = {0}; + char tokens[128+1] = ""; + + char imei[16] = {0}; + app_adp_get_imei_req(imei); + strncpy(uid, imei, 16); + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + jrtc_config(appkey, uid, key, tokens); + Hal_Mem_Set(&s_video_call_jrtc, 0x0, sizeof(MMI_VIDEO_CALL_JRTC_T)); +#endif +} + +void mmi_video_call_jrtc_config_init_01(char * t_tokens) +{ +#ifndef __VIDEO_CALL_TEST__ + char appkey[24+1] = "21b649200a62dd8cde334097"; + char key[16+1] = "41042Jxz17m69E16"; + char uid[64+1] = {0}; + char tokens[128+1] = {0}; + + char imei[16] = {0}; + app_adp_get_imei_req(imei); + strncpy(uid, imei, 16); + + memcpy(tokens, t_tokens, 128); + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%s\n", __FUNCTION__, __LINE__, strlen(appkey), appkey); + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%s\n", __FUNCTION__, __LINE__, strlen(uid), uid); + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%s\n", __FUNCTION__, __LINE__, strlen(key), key); + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%s\n", __FUNCTION__, __LINE__, strlen(tokens), tokens); + + jrtc_config(appkey, uid, key, tokens); + Hal_Mem_Set(&s_video_call_jrtc, 0x0, sizeof(MMI_VIDEO_CALL_JRTC_T)); +#endif +} + +static void mmi_video_call_jrtc_clean_up(void) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + if(NULL != s_video_call_jrtc.state_task) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_task_del(s_video_call_jrtc.state_task); + } + + Hal_Mem_Set(&s_video_call_jrtc, 0x0, sizeof(MMI_VIDEO_CALL_JRTC_T)); +} + +static void mmi_video_call_jrtc_timeout_cb(void * para) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + mmi_video_call_jrtc_clean_up(); +} + +static void mmi_video_call_jrtc_on_state(lv_task_t * task) +{ + static int8_t oldstate = -1; + video_call_jrtc_state_e state = jrtc_state(s_video_call_jrtc.jrtc_ptr); + + if(state != oldstate) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: oldstate=%d,state=%d\n", __FUNCTION__, __LINE__, oldstate, state); + } + + switch(state) + { + case JRTC_CLOSED: + if((NULL != s_video_call_jrtc.jrtc_ptr) && (NULL == s_video_call_jrtc.closed_timer_id)) + { + video_call_jrtc_error_e err = jrtc_error(s_video_call_jrtc.jrtc_ptr); + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: error=%d\n", __FUNCTION__, __LINE__, err); + + if(!s_video_call_jrtc.closing) + { + jrtc_close(s_video_call_jrtc.jrtc_ptr, JRTC_ENIL); + s_video_call_jrtc.closing = 1; + } + + s_video_call_jrtc.closed_timer_id = Hal_Timer_Start(100, mmi_video_call_jrtc_timeout_cb, NULL, 0); + } + + if(MMI_VIDEO_CALL_STATE_NONE != mmi_video_call_params_state_get()) + { + mmi_vc_ring_off_screen(); + } + break; + + case JRTC_LEAVING: + break; + + case JRTC_OPENED: + break; + + case JRTC_JOINING: + break; + + case JRTC_JOINED: + break; + + case JRTC_TALKING: + mmi_vc_call_action_connected(); + + /* Get image */ + if (MODEM_VIDEO_CALL_TYPE_VIDEO == mmi_video_call_params_type_get()) + { + void *buf = mmi_video_call_phone_get_video_buffer(); + if(voip_jrtc_get_image(buf)) + { + lv_canvas_set_buffer(mmi_vc_call_get_ext()->canvas, buf, canvas_width, canvas_heigh, LV_IMG_CF_TRUE_COLOR); + } + } + break; + + default: + break; + } + + oldstate = state; +} + + +static int8_t mmi_video_call_jrtc_open(const char* roomid, MODEM_VIDEO_CALL_TYPE calltype, char * t_ticket) +{ + char ticket[MMI_WATCH_VC_TICKET_LEN] = {0}; + memcpy(ticket, t_ticket, MMI_WATCH_VC_TICKET_LEN - 1); + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__, roomid, calltype); + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s\n", __FUNCTION__, __LINE__, ticket); + + if (NULL == roomid || NULL == ticket) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: params error\n", __FUNCTION__, __LINE__); + mmi_video_call_jrtc_clean_up(); + return -1; + } + + Hal_Mem_Set(&s_video_call_jrtc, 0, sizeof(MMI_VIDEO_CALL_JRTC_T)); + + if (MODEM_VIDEO_CALL_TYPE_VIDEO == calltype) + { + s_video_call_jrtc.rxframe.width = s_video_call_jrtc.txframe.width = 176; + s_video_call_jrtc.rxframe.height = s_video_call_jrtc.txframe.height = 144; + s_video_call_jrtc.rxframe.fps = s_video_call_jrtc.txframe.fps = 8; // 10; + s_video_call_jrtc.rxframe.kbps = s_video_call_jrtc.txframe.kbps = 120; // 240; + + mci_videocall_camera_set_sensor(1); // 0:rear camera; 1:front camera + + s_video_call_jrtc.jrtc_ptr= jrtc_open(roomid, ticket, &s_video_call_jrtc.rxframe, NULL); + } + else + { + s_video_call_jrtc.jrtc_ptr= jrtc_open(roomid, ticket, NULL, NULL); + } + + if (!s_video_call_jrtc.jrtc_ptr) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + mmi_video_call_jrtc_clean_up(); + return -1; + } + jrtc_activate(s_video_call_jrtc.jrtc_ptr, JRTC_AUDIO); + + s_video_call_jrtc.state_task = lv_task_create(mmi_video_call_jrtc_on_state, VIDEO_RENDER_PERIOD, LV_TASK_PRIO_HIGH, NULL); + return 0; +} + +int8_t mmi_video_call_dial_req(MODEM_VIDEO_CALL_TYPE calltype, char * pContactUri, char * t_ticket) +{ + int8_t ret = -1; + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__, pContactUri, calltype); + + if (NULL == s_video_call_jrtc.jrtc_ptr) + { + ret = mmi_video_call_jrtc_open(pContactUri, calltype, t_ticket); + } + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %p, %d\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr, ret); + + return ret; +} + +void mmi_video_call_hangup_req(BOOL bye) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, bye); + + mmi_vc_call_operate_send_to_server(); + + if (NULL != s_video_call_jrtc.jrtc_ptr) + { + video_call_jrtc_error_e err = (TRUE == bye) ? JRTC_EBYE : JRTC_EAUDIOCALL; + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %p,%d\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr, err); + + if(!s_video_call_jrtc.closing) + { + jrtc_close(s_video_call_jrtc.jrtc_ptr, err); + s_video_call_jrtc.closing = 1; + } + } + else + { + mmi_vc_ring_off_screen(); + } +} + +int8_t mmi_video_call_answer_req(char * t_ticket) +{ + int8_t ret = -1; + + if (NULL == s_video_call_jrtc.jrtc_ptr) + { + ret = mmi_video_call_jrtc_open(mmi_video_call_params_number_get(), mmi_video_call_params_type_get(), t_ticket); + } + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %p, %d\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr, ret); + + return ret; +} + +void mmi_video_call_reject_req(BOOL bye) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, bye); + + mmi_vc_call_operate_send_to_server(); + + if (NULL != s_video_call_jrtc.jrtc_ptr) + { + video_call_jrtc_error_e err = (TRUE == bye) ? JRTC_EBYE : JRTC_EAUDIOCALL; + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %p,%d\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr, err); + + if(!s_video_call_jrtc.closing) + { + jrtc_close(s_video_call_jrtc.jrtc_ptr, err); + s_video_call_jrtc.closing = 1; + } + } + else + { + mmi_vc_ring_off_screen(); + } +} + + +//extern unsigned yuv420_scale(int src_width, int src_height, int dst_width, int dst_height, unsigned char *src_buf, unsigned char *dst_buf, unsigned char semi); +//extern unsigned rgb565_scale(int32_t src_width, int32_t src_height, int32_t dst_width, int32_t dst_height, uint8_t *src_buf, uint8_t *dst_buf); +//extern void yuv420_2_rgb565(int width, int height, const unsigned char *src, unsigned short *dst, unsigned semi); + +static uint8_t voip_jrtc_get_image(void * preview_buf) +{ + uint8_t ret = 0; + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + LV_ASSERT_MEM(ext); + + video_call_jrtc_image_t * frame = NULL; + if(ext->local_remote_switch_flag == VOIP_REMOTE_SWITCH_REMOTE) + frame = &s_video_call_jrtc.rxframe; + else + frame = &s_video_call_jrtc.txframe; + + if (frame->put != frame->get) { +#if (ENABLE_VIDEO_SCALE == 0) + yuv420_2_rgb565(frame->width, frame->height, frame->data, preview_buf, frame->format); +#else + Hal_Yuv420_Render(frame->width, frame->height, canvas_width, canvas_heigh, frame->data, preview_buf, frame->format); +#endif + + frame->get = frame->put; + ret = 1; + voip_fps_check(frame->fps); + } + + return ret; +} + + +#else +typedef enum jrtc_state video_call_jrtc_state_e; +typedef enum jrtc_error video_call_jrtc_error_e; +typedef struct jrtc_image_t video_call_jrtc_image_t; + +typedef struct +{ + void /*lv_task_t*/ *state_task; + video_call_jrtc_image_t txframe; + video_call_jrtc_image_t rxframe; + void* jrtc_ptr; + TIMER_ID closed_timer_id; + uint8_t closing; +} MMI_VIDEO_CALL_JRTC_T; + + +static MMI_VIDEO_CALL_JRTC_T s_video_call_jrtc; + + +static uint8_t voip_jrtc_get_image(void * preview_buf); + +extern UINT32 OsaGetTicks(void *pForFutureUse); + + +void mmi_video_call_jrtc_config_init_00(void) +{ +#ifdef __VIDEO_CALL_TEST__ + char appkey[24+1] = "dc1db81c19d1da4f5fb4a197"; + char key[16+1] = "K75A1vS562671d38"; + char uid[64+1] = {0}; + char tokens[128+1] = ""; + + char imei[16] = {0}; + app_adp_get_imei_req(imei); + strncpy(uid, imei, 16); + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + jrtc_config(appkey, uid, key, tokens); + Hal_Mem_Set(&s_video_call_jrtc, 0x0, sizeof(MMI_VIDEO_CALL_JRTC_T)); +#endif +} + +void mmi_video_call_jrtc_config_init(char * t_appkey, char * t_secret, char * t_tokens, char * t_uid) +{ +#ifndef __VIDEO_CALL_TEST__ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%s\n", __FUNCTION__, __LINE__, strlen(t_appkey), t_appkey); + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%s\n", __FUNCTION__, __LINE__, strlen(t_uid), t_uid); + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%s\n", __FUNCTION__, __LINE__, strlen(t_secret), t_secret); + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%s\n", __FUNCTION__, __LINE__, strlen(t_tokens), t_tokens); + + jrtc_config(t_appkey, t_uid, t_secret, t_tokens); + Hal_Mem_Set(&s_video_call_jrtc, 0x0, sizeof(MMI_VIDEO_CALL_JRTC_T)); +#endif +} + +static void mmi_video_call_jrtc_clean_up(void) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + if(NULL != s_video_call_jrtc.state_task) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_task_del(s_video_call_jrtc.state_task); + } + + Hal_Mem_Set(&s_video_call_jrtc, 0x0, sizeof(MMI_VIDEO_CALL_JRTC_T)); +} + +static void mmi_video_call_jrtc_timeout_cb(void * para) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + mmi_video_call_jrtc_clean_up(); +} + +static void mmi_video_call_jrtc_on_state(lv_task_t * task) +{ + static int8_t oldstate = -1; + video_call_jrtc_state_e state = jrtc_state(s_video_call_jrtc.jrtc_ptr); + + if(state != oldstate) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: oldstate=%d,state=%d\n", __FUNCTION__, __LINE__, oldstate, state); + } + + switch(state) + { + case JRTC_CLOSED: + if((NULL != s_video_call_jrtc.jrtc_ptr) && (NULL == s_video_call_jrtc.closed_timer_id)) + { + video_call_jrtc_error_e err = jrtc_error(s_video_call_jrtc.jrtc_ptr); + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: error=%d\n", __FUNCTION__, __LINE__, err); + + if(!s_video_call_jrtc.closing) + { + jrtc_close(s_video_call_jrtc.jrtc_ptr, JRTC_ENIL); + s_video_call_jrtc.closing = 1; + } + + s_video_call_jrtc.closed_timer_id = Hal_Timer_Start(100, mmi_video_call_jrtc_timeout_cb, NULL, 0); + } + + if(MMI_VIDEO_CALL_STATE_NONE != mmi_video_call_params_state_get()) + { + mmi_vc_ring_off_screen(); + } + break; + + case JRTC_LEAVING: + break; + + case JRTC_OPENED: + break; + + case JRTC_JOINING: + break; + + case JRTC_JOINED: + break; + + case JRTC_TALKING: + mmi_vc_call_action_connected(); + + /* Get image */ + if (MODEM_VIDEO_CALL_TYPE_VIDEO == mmi_video_call_params_type_get()) + { + void *buf = mmi_video_call_phone_get_video_buffer(); + if(voip_jrtc_get_image(buf)) + { + lv_canvas_set_buffer(mmi_vc_call_get_ext()->canvas, buf, canvas_width, canvas_heigh, LV_IMG_CF_TRUE_COLOR); + } + } + break; + + default: + break; + } + + oldstate = state; +} + + +static int8_t mmi_video_call_jrtc_open(char * t_number, char * t_ticket) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s\n", __FUNCTION__, __LINE__, t_number); + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s\n", __FUNCTION__, __LINE__, t_ticket); + + if (NULL == t_number || NULL == t_ticket) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: params error\n", __FUNCTION__, __LINE__); + mmi_video_call_jrtc_clean_up(); + return -1; + } + + Hal_Mem_Set(&s_video_call_jrtc, 0, sizeof(MMI_VIDEO_CALL_JRTC_T)); + + s_video_call_jrtc.rxframe.width = s_video_call_jrtc.txframe.width = 176; + s_video_call_jrtc.rxframe.height = s_video_call_jrtc.txframe.height = 144; + s_video_call_jrtc.rxframe.fps = s_video_call_jrtc.txframe.fps = 8; // 10; + s_video_call_jrtc.rxframe.kbps = s_video_call_jrtc.txframe.kbps = 120; // 240; + + //mci_videocall_camera_set_sensor(1); // 0:rear camera; 1:front camera + + s_video_call_jrtc.jrtc_ptr= jrtc_open(t_number, t_ticket, &s_video_call_jrtc.rxframe, &s_video_call_jrtc.txframe); + + if (!s_video_call_jrtc.jrtc_ptr) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + mmi_video_call_jrtc_clean_up(); + return -1; + } + jrtc_activate(s_video_call_jrtc.jrtc_ptr, JRTC_AUDIO); + + s_video_call_jrtc.state_task = lv_task_create(mmi_video_call_jrtc_on_state, VIDEO_RENDER_PERIOD, LV_TASK_PRIO_HIGH, NULL); + return 0; +} + +int8_t mmi_video_call_dial_req(char * t_number, char * t_ticket) +{ + int8_t ret = -1; + + if (NULL == s_video_call_jrtc.jrtc_ptr) + { + ret = mmi_video_call_jrtc_open(t_number, t_ticket); + } + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %p, %d\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr, ret); + + return ret; +} + +void mmi_video_call_hangup_req(BOOL bye) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, bye); + + mmi_vc_call_operate_send_to_server(); + + if (NULL != s_video_call_jrtc.jrtc_ptr) + { + video_call_jrtc_error_e err = (TRUE == bye) ? JRTC_EBYE : JRTC_EAUDIOCALL; + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %p,%d\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr, err); + + if(!s_video_call_jrtc.closing) + { + jrtc_close(s_video_call_jrtc.jrtc_ptr, err); + s_video_call_jrtc.closing = 1; + } + } + else + { + mmi_vc_ring_off_screen(); + } +} + + +//extern unsigned yuv420_scale(int src_width, int src_height, int dst_width, int dst_height, unsigned char *src_buf, unsigned char *dst_buf, unsigned char semi); +//extern unsigned rgb565_scale(int32_t src_width, int32_t src_height, int32_t dst_width, int32_t dst_height, uint8_t *src_buf, uint8_t *dst_buf); +//extern void yuv420_2_rgb565(int width, int height, const unsigned char *src, unsigned short *dst, unsigned semi); + +static uint8_t voip_jrtc_get_image(void * preview_buf) +{ + uint8_t ret = 0; + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + LV_ASSERT_MEM(ext); + + video_call_jrtc_image_t * frame = NULL; + if(ext->local_remote_switch_flag == VOIP_REMOTE_SWITCH_REMOTE) + frame = &s_video_call_jrtc.rxframe; + else + frame = &s_video_call_jrtc.txframe; + + if (frame->put != frame->get) { +#if (ENABLE_VIDEO_SCALE == 0) + yuv420_2_rgb565(frame->width, frame->height, frame->data, preview_buf, frame->format); +#else + Hal_Yuv420_Render(frame->width, frame->height, canvas_width, canvas_heigh, frame->data, preview_buf, frame->format); +#endif + + frame->get = frame->put; + ret = 1; + voip_fps_check(frame->fps); + } + + return ret; +} +#endif + +#endif + diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_hzch.c b/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_hzch.c new file mode 100644 index 00000000..f64a70f0 --- /dev/null +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_hzch.c @@ -0,0 +1,3616 @@ + + + +#include "lv_watch.h" + + +#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__ + + +#if 1 + +//static lv_signal_cb_t ancestor_signal; +#if VIDEO_SIGNAL_CHECK +static lv_task_t * signal_check_task = NULL; +#endif +static lv_task_t * rat_check_task = NULL; + +static MMI_VIDEO_CALL_PARAMS_T s_video_call_params = {0}; +lv_color_t g_cbuf[canvas_width * canvas_heigh + 8] __attribute__((aligned(8))); + +static uint8_t s_vc_contact_selected_index = 0; + +static char s_video_call_ticket[MMI_WATCH_VC_TICKET_LEN] = {0}; +static char s_video_call_tokens[MMI_WATCH_VC_TOKENS_LEN] = {0}; + + +/********************** +* STATIC PROTOTYPES +**********************/ +static void voip_phone_left_slide_callback(lv_obj_t * obj); +static void voip_phone_right_slide_callback(lv_obj_t * obj); +static void voip_phone_down_slide_callback(lv_obj_t * obj); +static void voip_volume_btn_action(lv_obj_t * obj, lv_event_t e); +static void voip_slider_action(lv_obj_t * slider, lv_event_t e); +static void voip_phone_obj_hide_anim_end(lv_anim_t * anim); +static void voip_anim_fp_dialing_ring(lv_obj_t * obj, int32_t x); +static void voip_set_volume_when_slider_act(void); +static void voip_local_remote_switch_action(lv_obj_t * btn, lv_event_t e); +static void canvas_button_hidden_event_cb(lv_obj_t * obj, lv_event_t e); +static void voip_signal_check_start(void * ext); +static void voip_signal_check_stop(void); +static bool is_rat_gsm(void); +static void voip_rat_check_start(void); +static void voip_rat_check_stop(void); + + +void mmi_vc_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, priority); + + if(AUDIO_CTRL_PRIORITY_2 > priority) + { + lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE); + if(activity_obj == NULL) + { + return; + } + mmi_vc_activity_destroy_req(); + Hal_Vibrator_Play_End(); + Hal_Tone_Play_End(); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2); + } +} + +void * mmi_video_call_phone_get_video_buffer() +{ + return g_cbuf; +} + +/********************** +* STATIC FUNCTIONS +**********************/ +static lv_obj_t * mmi_vc_call_get_activity_obj(void) +{ + lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE); + + return(activity_obj); +} + +static lv_obj_t * mmi_vc_call_get_obj(void) +{ + lv_obj_t * watch_obj = NULL; + + lv_obj_t * activity_obj = mmi_vc_call_get_activity_obj(); + + if(activity_obj) + { + lv_watch_get_child_obj(activity_obj, lv_watch_obj_signal, &watch_obj); + } + + return(watch_obj); +} + +lv_vc_call_obj_ext_t * mmi_vc_call_get_ext(void) +{ + lv_vc_call_obj_ext_t * ext = NULL; + lv_obj_t * watch_obj = mmi_vc_call_get_obj(); + + if(watch_obj) + { + ext = lv_obj_get_ext_attr(watch_obj); + } + + return(ext); +} + +static void mmi_vc_call_params_clean(void) +{ + _lv_memset_00(&s_video_call_params, sizeof(MMI_VIDEO_CALL_PARAMS_T)); +} + +static void mmi_vc_call_screen_clean(void) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_obj_t * slider_activit_obj = lv_watch_get_activity_obj(ACT_ID_SLIDER); + + if(slider_activit_obj) + { + lv_obj_del(slider_activit_obj); + } + + lv_obj_t * activity_obj = mmi_vc_call_get_activity_obj(); + if(activity_obj) + { + lv_obj_del(activity_obj); + } +} + +static void voip_phone_left_slide_callback(lv_obj_t * obj) +{ + printf("%s %d\n", __FUNCTION__, __LINE__); + if((MMI_VIDEO_CALL_STATE_CALLING == s_video_call_params.state) + && (MODEM_VIDEO_CALL_TYPE_VIDEO == s_video_call_params.call_type)) + { + voip_local_remote_switch_action(NULL, LV_EVENT_CLICKED); + } +} + +static void voip_phone_right_slide_callback(lv_obj_t * obj) +{ + printf("%s %d\n", __FUNCTION__, __LINE__); + mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED); +} + +static void voip_phone_down_slide_callback(lv_obj_t * obj) +{ + printf("%s %d\n", __FUNCTION__, __LINE__); + voip_volume_btn_action(NULL, LV_EVENT_CLICKED); +} + +static void voip_slider_action(lv_obj_t * slider, lv_event_t e) +{ + if(e == LV_EVENT_VALUE_CHANGED) + { + printf("%s %d\n", __FUNCTION__, __LINE__); + + uint8_t v = lv_slider_get_value(slider); + + // set speaker volume + if(!Hal_Set_BT_Audio_Path((HAL_SPEAKER_GAIN)v)) + Hal_Call_Speaker(HAL_CALL_SPK_ON, (HAL_SPEAKER_GAIN)v); + s_video_call_params.speaker_volume = v; + } +} + +static void voip_volume_btn_action(lv_obj_t * obj, lv_event_t e) +{ + if(LV_EVENT_CLICKED != e) { + return; + } + + printf("%s %d\n", __FUNCTION__, __LINE__); + slider_create(NULL, SETTING_VOIP_SPEAKER, 40, voip_slider_action); +} + +static void mmi_vc_get_time_elaps(uint32_t last_time, char * str, int8_t size) +{ + hal_rtc_t rtc_curr; // current rtc time + uint32_t second_curr = 0; // seconds of current time + + Hal_Rtc_Gettime(&rtc_curr); + second_curr = time_to_seconds(&rtc_curr); + + uint32_t elaps = second_curr - last_time; + uint32_t seconds = elaps % 60; + uint32_t minutes = elaps / 60; + uint32_t hours = minutes / 60; + minutes = minutes % 60; + + if(hours == 0) + snprintf(str, size, "%.2d:%.2d", minutes, seconds); + else + snprintf(str, size, "%.2d:%.2d:%.2d", hours, minutes, seconds); +} + +static lv_obj_t * mmi_vc_ring_off_content_create(lv_obj_t * par) +{ + printf("%s %d\n", __FUNCTION__, __LINE__); + if(par == NULL) { + par = lv_scr_act(); + } + + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + LV_ASSERT_MEM(ext); + if(ext == NULL) { + return(NULL); + } + + lv_obj_t * obj = lv_obj_create(par, NULL); + LV_ASSERT_MEM(obj); + if(obj == NULL) { + return(NULL); + } + lv_obj_set_size(obj, lv_obj_get_width(par), lv_obj_get_height(par)); + lv_obj_add_style(obj, LV_OBJ_PART_MAIN, &lv_style_transp_tight); + + lv_obj_t * content = lv_cont_create(obj, NULL); + LV_ASSERT_MEM(content); + if(content == NULL) { + return(NULL); + } + lv_obj_set_style_local_radius(content, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 15); + //lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_cont_opa1); + lv_obj_set_size(content, LV_HOR_RES - 40, 50); + lv_obj_align(content, obj, LV_ALIGN_CENTER, 0, -10); + lv_cont_set_layout(content, LV_LAYOUT_CENTER); + lv_obj_set_click(content, false); + + lv_obj_t * label = lv_label_create(content, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26); // &lv_watch_font20); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + + if(is_rat_gsm()) + { + lv_label_set_text_id(label, WATCH_TEXT_ID_NETWORK_WRONG); + } + else + { + if(ext->vc_ui == MMI_VC_UI_CONNECTED) + { + char tmp[20] = ""; + char str[30] = ""; + mmi_vc_get_time_elaps(ext->connect_start_time, tmp, 20); + snprintf(str, 30, "%s(%s)", (char *)lv_lang_get_text(WATCH_TEXT_ID_RING_OFF), tmp); + lv_label_set_text(label, str); + } + else + { + lv_label_set_text_id(label, WATCH_TEXT_ID_RING_OFF); + } + } + + lv_obj_set_click(label, false); + + return(obj); +} + +static void voip_anim_fp_connecting_ring(lv_obj_t * obj, int32_t x) +{ + if(obj != NULL) { + lv_obj_set_x(obj, x); + } +} + +static void mmi_vc_connecting_animation(lv_obj_t * par) +{ + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + + LV_ASSERT_MEM(ext); + if(ext == NULL) { + return; + } + + lv_obj_t * img = lv_img_create(mmi_vc_call_get_obj(), NULL); + lv_img_set_src(img, LV_SYMBOL_LOOP); + lv_obj_add_style(img, LV_OBJ_PART_MAIN, &lv_watch_image); + lv_obj_set_style_local_text_font(img, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, LV_THEME_WATCH_NIGHT_SYMBOL_NORMAL); + lv_obj_set_y(img, lv_obj_get_y(par) + lv_obj_get_y(lv_obj_get_parent(par))); + ext->phone_animation_obj = img; + + /*Create an animation to move the button continuously left to right*/ + lv_anim_t a; + lv_anim_path_t path; + lv_anim_value_t start = lv_obj_get_x(par) + lv_obj_get_width(par) + 6; + lv_anim_value_t end = start + 30; + + lv_anim_path_init(&path); + lv_anim_path_set_cb(&path, lv_anim_path_linear); + + lv_anim_init(&a); + lv_anim_set_var(&a, img); + lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)voip_anim_fp_connecting_ring); + lv_anim_set_path(&a, &path); + lv_anim_set_values(&a, start, end); + lv_anim_set_time(&a, 400); + lv_anim_set_playback_time(&a, 400); + lv_anim_set_playback_delay(&a, 0); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + lv_anim_set_repeat_delay(&a, 500); + + lv_anim_start(&a); +} + +static void voip_anim_fp_dialing_ring(lv_obj_t * obj, int32_t x) +{ + if(obj != NULL) { + lv_obj_set_x(obj, x); + } +} + +static void mmi_vc_dialing_animation(lv_obj_t * par) +{ + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + + LV_ASSERT_MEM(ext); + if(ext == NULL) { + return; + } + + lv_obj_t * img = lv_img_create(mmi_vc_call_get_obj(), NULL); + lv_img_set_src(img, LV_SYMBOL_RIGHT); + lv_obj_add_style(img, LV_OBJ_PART_MAIN, &lv_watch_image); + lv_obj_set_style_local_text_font(img, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, LV_THEME_WATCH_NIGHT_SYMBOL_NORMAL); + lv_obj_set_y(img, lv_obj_get_y(par) + lv_obj_get_y(lv_obj_get_parent(par))); + ext->phone_animation_obj = img; + + /*Create an animation to move the button continuously left to right*/ + lv_anim_t a; + lv_anim_path_t path; + lv_anim_value_t start = lv_obj_get_x(par) + lv_obj_get_width(par) + 6; + lv_anim_value_t end = start + 30; + + lv_anim_path_init(&path); + lv_anim_path_set_cb(&path, lv_anim_path_linear); + + lv_anim_init(&a); + lv_anim_set_var(&a, img); + lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)voip_anim_fp_dialing_ring); + lv_anim_set_path(&a, &path); + lv_anim_set_values(&a, start, end); + lv_anim_set_time(&a, 400); + lv_anim_set_playback_time(&a, 400); + lv_anim_set_playback_delay(&a, 0); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + lv_anim_set_repeat_delay(&a, 500); + + lv_anim_start(&a); +} + +static void mmi_vc_ring_animation(lv_obj_t * par) +{ + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + + LV_ASSERT_MEM(ext); + if(ext == NULL) { + return; + } + + lv_obj_t * img = lv_img_create(mmi_vc_call_get_obj(), NULL); + lv_img_set_src(img, LV_SYMBOL_LEFT); + lv_obj_add_style(img, LV_OBJ_PART_MAIN, &lv_watch_image); + lv_obj_set_style_local_text_font(img, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, LV_THEME_WATCH_NIGHT_SYMBOL_NORMAL); + lv_obj_set_y(img, lv_obj_get_y(par) + lv_obj_get_y(lv_obj_get_parent(par))); + ext->phone_animation_obj = img; + + /*Create an animation to move the button continuously left to right*/ + lv_anim_t a; + lv_anim_path_t path; + lv_anim_value_t start = lv_obj_get_x(par) - 20; + lv_anim_value_t end = start - 30; + + lv_anim_path_init(&path); + lv_anim_path_set_cb(&path, lv_anim_path_linear); + + lv_anim_init(&a); + lv_anim_set_var(&a, img); + lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)voip_anim_fp_dialing_ring); + lv_anim_set_path(&a, &path); + lv_anim_set_values(&a, start, end); + lv_anim_set_time(&a, 400); + lv_anim_set_playback_time(&a, 400); + lv_anim_set_playback_delay(&a, 0); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + lv_anim_set_repeat_delay(&a, 500); + + lv_anim_start(&a); +} + +static void mmi_vc_anim_fp_connected(lv_anim_t * anim) +{ + lv_obj_t * obj = (lv_obj_t *)anim->var; + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + + LV_ASSERT_MEM(ext); + if(ext == NULL) { + return; + } + + char str[20] = ""; + mmi_vc_get_time_elaps(ext->connect_start_time, str, 20); + if(obj) { + lv_label_set_text(obj, str); + } +} + +static void mmi_vc_connected_animation(lv_obj_t * obj) +{ + lv_anim_t a; + lv_anim_path_t path; + + lv_anim_path_init(&path); + lv_anim_path_set_cb(&path, lv_anim_path_step); + + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_start_cb(&a, (lv_anim_ready_cb_t)mmi_vc_anim_fp_connected); + lv_anim_set_path(&a, &path); + lv_anim_set_time(&a, 1); + lv_anim_set_playback_time(&a, 0); + lv_anim_set_playback_delay(&a, 0); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + lv_anim_set_repeat_delay(&a, 1000); + + lv_anim_start(&a); +} + +static void mmi_vc_ring_off_obj_hide_anim_end(lv_anim_t * anim) +{ + (void)anim; + printf("%s %d\n", __FUNCTION__, __LINE__); + + mmi_vc_call_screen_clean(); +} + +void mmi_vc_ring_off_screen(void) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + // stop playing tone + Hal_Tone_Play_End(); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2); + + // stop timer + mmi_vc_all_timer_stop(); + + // + voip_signal_check_stop(); + voip_rat_check_stop(); + + // create ring off UI + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + if(NULL != ext) + { + //if(ext->vc_ui == MMI_VC_UI_INCOMING || ext->vc_ui == MMI_VC_UI_DIALING) + { + if(ext->phone_status_label) + { + //lv_label_set_text(ext->phone_status_label, ""); + lv_obj_set_hidden(ext->phone_status_label, true); + } + } + mmi_vc_ring_off_content_create(mmi_vc_call_get_obj()); + + if(ext->phone_animation_obj) + { + lv_obj_del(ext->phone_animation_obj); + ext->phone_animation_obj = NULL; + } + + /* set speaker volume to nv when leaving activiry's slider */ + voip_set_volume_when_slider_act(); + + /* phone cleanup when anim end*/ + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, mmi_vc_call_get_obj()); + lv_anim_set_ready_cb(&a, (lv_anim_ready_cb_t)mmi_vc_ring_off_obj_hide_anim_end); + lv_anim_set_time(&a, MMI_VC_RING_OFF_ANIM_TIMEOUT); + lv_anim_start(&a); + } + + if(MMI_MODEM_CALL_STATE_NULL != phone_get_call_state()) + { + printf("%s tele call is on going, keep para of audio\n", __FUNCTION__); + Hal_Set_Voice_Call_Status(VOICE_CALL_END); + Hal_Disconnect_BT_Audio_Path(); + } + watch_wakeup_time_reset(); + + mmi_vc_call_params_clean(); +} + +static bool mmi_vc_check_mo_permission(void) +{ + if((!watch_modem_sim_present_check_req()) + || (MMI_MODEM_SIGNAL_BAR_0 == watch_modem_get_signal_bar_req()) +// || (MODEM_VIDEO_CALL_REG_OK != watch_modem_video_call_get_reg_stat_req()) + || (is_rat_gsm()) + ) + { + return false; + } + + return true; +} + +static void voip_local_remote_switch_action(lv_obj_t * btn, lv_event_t e) +{ + if(LV_EVENT_CLICKED != e) { + return; + } + + printf("%s %d\n", __FUNCTION__, __LINE__); + lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE); + if(!activity_obj) { + return; + } + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + if(!ext) { + return; + } + if(ext->local_remote_switch_flag == VOIP_REMOTE_SWITCH_NULL) { + return; + } + if(ext->local_remote_switch_flag == VOIP_REMOTE_SWITCH_REMOTE) { + ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_LOCAL; + } else { + ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_REMOTE; + } +} + +static lv_res_t video_call_element_signal_func(lv_obj_t * element, lv_signal_t sign, void * param) +{ + lv_res_t res; + + //printf("%s, sign=%d\n", __FUNCTION__, sign); + /* if not click signs, invoke ancient handler and return */ + if(sign != LV_SIGNAL_PRESSING && sign != LV_SIGNAL_PRESSED && sign != LV_SIGNAL_RELEASED && sign != LV_SIGNAL_PRESS_LOST) { + /* Include the ancient signal function */ + lv_signal_cb_t sign_func = (lv_signal_cb_t)(lv_obj_get_user_data(element).user_data); + res = sign_func(element, sign, param); + if(res != LV_RES_OK) { + return(res); + } + + return(LV_RES_OK); + } + + lv_obj_t * obj = lv_obj_get_parent(element); + while(obj) { + if(lv_obj_get_signal_cb(obj) != lv_watch_obj_signal) { + obj = lv_obj_get_parent(obj); + } else { + break; + } + } + if(obj == NULL) { + return(LV_RES_INV); + } + + res = lv_watch_obj_signal(obj, sign, param); + if(res != LV_RES_OK) { + return(res); + } + + /* Include the ancient signal function */ + lv_signal_cb_t sign_func = (lv_signal_cb_t)(lv_obj_get_user_data(element).user_data); + res = sign_func(element, sign, param); + if(res != LV_RES_OK) { + return(res); + } + + return(LV_RES_OK); +} /* video_call_element_signal_func */ + +static void video_call_add_element(lv_obj_t * element) +{ + lv_watch_set_free_ptr(element, lv_obj_get_signal_cb(element)); + lv_obj_set_signal_cb(element, video_call_element_signal_func); + lv_obj_add_protect(element, LV_PROTECT_PRESS_LOST | LV_PROTECT_CLICK_FOCUS); +} + +static void canvas_button_hidden_event_cb(lv_obj_t * obj, lv_event_t e) +{ + if(LV_EVENT_CLICKED == e) + { + printf("%s %d\n", __FUNCTION__, __LINE__); + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + if(!ext) { + return; + } + if(ext->canvas_button_hidden_flag == NOT_HIDDEN) { + ext->canvas_button_hidden_flag = HIDDEN; + } else { + ext->canvas_button_hidden_flag = NOT_HIDDEN; + } + + lv_obj_set_hidden(ext->connect_time, ext->canvas_button_hidden_flag); + lv_obj_set_hidden(ext->volume_button, ext->canvas_button_hidden_flag); + lv_obj_set_hidden(ext->view_switch_button, true); // lv_obj_set_hidden(ext->view_switch_button, ext->canvas_button_hidden_flag); + lv_obj_set_hidden(ext->ring_off_button, ext->canvas_button_hidden_flag); + } +} + +static void voip_set_volume_when_slider_act(void) +{ + printf("%s\n", __FUNCTION__); + if(lv_watch_get_activity_obj(ACT_ID_SLIDER)) { + if(MMI_VIDEO_CALL_STATE_NONE != s_video_call_params.state) { + uint8_t volume = mmi_vc_get_call_volume(); + printf("set nv, speaker volume is %d.\n", volume); + UI_NV_Write_Req(NV_SECTION_UI_PHONE, 0, 1, &volume); + } + } +} + +#if VIDEO_SIGNAL_CHECK +static void signal_check(lv_task_t *task) +{ + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + if(!ext) return; + + if((false == is_rat_gsm()) && + (watch_modem_get_signal_bar_req() < MMI_MODEM_SIGNAL_BAR_3)) { + lv_obj_set_hidden(ext->signal_weak_label, false); + } else { + lv_obj_set_hidden(ext->signal_weak_label, true); + } +} +#endif + +static void voip_signal_check_start(void * ext) +{ +#if VIDEO_SIGNAL_CHECK + if(NULL == signal_check_task) + signal_check_task = lv_task_create(signal_check, VIDEO_SIGNAL_CHECK_PERIOD, LV_TASK_PRIO_HIGH, NULL); +#endif +} + +static void voip_signal_check_stop(void) +{ +#if VIDEO_SIGNAL_CHECK + if(signal_check_task) { + lv_task_del(signal_check_task); + signal_check_task = NULL; + } +#endif +} + +static bool is_rat_gsm(void) +{ + MMI_MODEM_PLMN_RAT rat; + + watch_modem_get_operator_req(&rat); + if(MMI_MODEM_PLMN_RAT_GSM == rat) + return true; + else + return false; +} + +static void rat_check(lv_task_t *task) +{ + if(is_rat_gsm()) { + mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED); + } +} + +static void voip_rat_check_start(void) +{ + if(NULL == rat_check_task) + rat_check_task = lv_task_create(rat_check, VIDEO_RAT_CHECK_PERIOD, LV_TASK_PRIO_HIGH, NULL); +} + +static void voip_rat_check_stop(void) +{ + if(rat_check_task) { + lv_task_del(rat_check_task); + rat_check_task = NULL; + } +} + +void voip_fps_check(int8_t fps) +{ + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + if(NULL != ext) { + if((VIDEO_CALL_FPS_CHECK_LIMIT >= fps) && (0 != fps)) { + printf("%s %d\n", __FUNCTION__, fps); + if(lv_obj_get_hidden(ext->signal_weak_label) == false) return; + lv_obj_set_hidden(ext->signal_weak_label, false); + } else { + if(lv_obj_get_hidden(ext->signal_weak_label) == true) return; + lv_obj_set_hidden(ext->signal_weak_label, true); + } + } +} + + + + +static nv_watch_vc_contact_t s_vc_contact = {0}; +static TIMER_ID fail_timer_id = NULL; +static MMI_VIDEO_CALL_UI_E s_vc_call_ui = MMI_VC_UI_INVALID; + +char * mmi_video_call_params_number_get(void) +{ + return (s_video_call_params.number); +} + +MMI_VIDEO_CALL_STATE_E mmi_video_call_params_state_get(void) +{ + return (s_video_call_params.state); +} + +MODEM_VIDEO_CALL_TYPE mmi_video_call_params_type_get(void) +{ + return (s_video_call_params.call_type); +} + + + +void mmi_video_call_contact_nv_write(void) +{ + uint32_t nv_data_length = sizeof(nv_watch_vc_contact_t); + + if(nv_data_length != UI_NV_Write_Req(NV_SECTION_UI_VC_CONTACT, 0, nv_data_length, (uint8_t *)&s_vc_contact)) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: nv write fail\n", __FUNCTION__, __LINE__); + } +} + +void mmi_video_call_contact_nv_read(void) +{ + uint32_t nv_data_length = sizeof(nv_watch_vc_contact_t); + + if(nv_data_length != UI_NV_Read_Req(NV_SECTION_UI_VC_CONTACT, 0, nv_data_length, (uint8_t *)&s_vc_contact)) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: nv read fail\n", __FUNCTION__, __LINE__); + } +} + +void mmi_vc_contact_set(nv_watch_vc_contact_t * contact_list) +{ + if(NULL == contact_list) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return; + } + + _lv_memcpy(&s_vc_contact, contact_list, sizeof(nv_watch_vc_contact_t)); + mmi_video_call_contact_nv_write(); + + + //phonebook_update_ui(contact_list, count, 0, 0); + +} + +bool mmi_vc_is_in_call(void) +{ + if(MMI_VIDEO_CALL_STATE_NONE == s_video_call_params.state || MMI_VIDEO_CALL_STATE_INVALID == s_video_call_params.state) + return false; + + return true; +} + +// +void mmi_vc_call_operate_send_to_server(void) +{ + mmi_protocol_fzd_action_VC_CALL_RESPONSE(s_video_call_params.number, s_video_call_ticket, s_video_call_params.call_type); +} + +void mmi_vc_ring_off_timer_stop(void) +{ + if(NULL != s_video_call_params.ring_off_timer_id) + { + Hal_Timer_Stop(s_video_call_params.ring_off_timer_id); + s_video_call_params.ring_off_timer_id = NULL; + } +} + +void mmi_vc_dialing_timer_stop(void) +{ + if(NULL != s_video_call_params.dialing_timer_id) + { + Hal_Timer_Stop(s_video_call_params.dialing_timer_id); + s_video_call_params.dialing_timer_id = NULL; + } +} + +void mmi_vc_connecting_timer_stop(void) +{ + if(NULL != s_video_call_params.connecting_timer_id) + { + Hal_Timer_Stop(s_video_call_params.connecting_timer_id); + s_video_call_params.connecting_timer_id = NULL; + } +} + +void mmi_vc_all_timer_stop(void) +{ + mmi_vc_dialing_timer_stop(); + mmi_vc_connecting_timer_stop(); + mmi_vc_ring_off_timer_stop(); +} + +static void mmi_vc_ui_prepare_destory(lv_obj_t * activity_obj) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_watch_png_cache_all_free(); + + // ring off + mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED); +} + +static void mmi_vc_hook_action(lv_obj_t * btn, lv_event_t e) +{ + if(LV_EVENT_CLICKED != e) + { + return; + } + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + // + Hal_Vibrator_Play_End(); + Hal_Tone_Play_End(); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2); + + // stop timer + mmi_vc_all_timer_stop(); + + mmi_vc_call_action_connecting(); + + //mmi_video_call_jrtc_config_init_01(s_video_call_tokens); + int8_t ret = mmi_video_call_answer_req(s_video_call_ticket); + if(ret < 0) + { + mmi_vc_ring_off_screen(); + } +} + +void mmi_vc_ring_off_action(lv_obj_t * btn, lv_event_t e) +{ + if(LV_EVENT_CLICKED != e) + { + return; + } + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, s_video_call_params.state); + + // stop playing tone + Hal_Vibrator_Play_End(); + Hal_Tone_Play_End(); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2); + + // + voip_signal_check_stop(); + voip_rat_check_stop(); + + // stop timer + mmi_vc_all_timer_stop(); + + switch(s_video_call_params.state) + { + case MMI_VIDEO_CALL_STATE_NONE: + case MMI_VIDEO_CALL_STATE_INVALID: + // do noting + break; + + case MMI_VIDEO_CALL_STATE_INCOMING: + mmi_video_call_reject_req(TRUE); + break; + + default: + mmi_video_call_hangup_req(TRUE); + break; + } + // watch_wakeup_time_reset(); + // watch_set_suspend_enable(true, ACT_ID_VOIPPHONE, 0); +} + +void mmi_ui_msg_update_vc_call_stop(void) +{ + mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED); +} + +void mmi_vc_call_action_call_stop(void) +{ + if(true != mmi_vc_is_in_call()) + { + return; + } + + mmi_watch_wake_up(); + mmi_ui_msg_action_vc_call_stop(); +} + +static void mmi_vc_ui_dialing(lv_obj_t * content) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + if(ext == NULL) + { + return; + } + + lv_obj_t * label; + uint32_t text_id = WATCH_TEXT_ID_VIDEO_CALL_DAILING; + if(MODEM_VIDEO_CALL_TYPE_VIDEO != s_video_call_params.call_type) + text_id = WATCH_TEXT_ID_VOICE_CALL_DAILING; + + // label dialing + label = lv_label_create(content, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_label_set_text_id(label, text_id); + lv_obj_set_click(label, false); + lv_obj_align(label, content, LV_ALIGN_IN_TOP_MID, 0, 10); + ext->phone_status_label = label; + + // img + lv_obj_t * img = lv_img_create(content, NULL); + lv_img_set_src(img, ICON_VIDEO_CALL_CONTACT_PHOTO); + lv_obj_align(img, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); + lv_obj_set_click(img, false); + + // name + label = lv_label_create(content, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL); + lv_obj_set_width(label, lv_obj_get_width(content) - 20); + if(strlen(s_video_call_params.name) > 0) + { + lv_label_set_text(label, s_video_call_params.name); + } + else + { + lv_label_set_text(label, s_video_call_params.number); + } +#if USE_LV_WATCH_UI_240_280 + lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); +#else + lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); +#endif + lv_obj_set_click(label, false); + + #if 0 + // btn volume + lv_obj_t * btn; + btn = lv_imgbtn_create(cont, NULL); + lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_PHONE_RING_VOLUME); + lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_PHONE_RING_VOLUME); + lv_obj_set_event_cb(btn, voip_volume_btn_action); + lv_obj_align(btn, cont, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0); + #endif + + // btn ring off + lv_obj_t * btn = lv_imgbtn_create(content, NULL); + lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN); + lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN); + lv_obj_set_event_cb(btn, mmi_vc_ring_off_action); + lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_MID, 0, MMI_VC_RING_OFF_BTN_Y_OFFSET); +} + +static void mmi_vc_ui_incoming(lv_obj_t * content) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + if(ext == NULL) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return; + } + lv_obj_t * label; + uint32_t text_id = WATCH_TEXT_ID_VIDEO_CALL_RINGING; + if(MODEM_VIDEO_CALL_TYPE_VIDEO != s_video_call_params.call_type) + text_id = WATCH_TEXT_ID_VOICE_CALL_RINGING; + + // label ringing + label = lv_label_create(content, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_label_set_text_id(label, text_id); + lv_obj_set_click(label, false); + lv_obj_align(label, content, LV_ALIGN_IN_TOP_MID, 0, 10); + ext->phone_status_label = label; + + // img + lv_obj_t * img = lv_img_create(content, NULL); + lv_img_set_src(img, ICON_VIDEO_CALL_CONTACT_PHOTO); + lv_obj_align(img, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); + lv_obj_set_click(img, false); + + // name + label = lv_label_create(content, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL); + lv_obj_set_width(label, lv_obj_get_width(content) - 20); + if(strlen(s_video_call_params.name) > 0) + { + lv_label_set_text(label, s_video_call_params.name); + } + else + { + lv_label_set_text(label, s_video_call_params.number); + } +#if USE_LV_WATCH_UI_240_280 + lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); +#else + lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); +#endif + lv_obj_set_click(label, false); + + // btn ring off + lv_obj_t * btn; + btn = lv_imgbtn_create(content, NULL); + lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN); + lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN); + lv_obj_set_event_cb(btn, mmi_vc_ring_off_action); + lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_LEFT, MMI_VC_INCOMING_RING_OFF_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET); + + // btn ring hook + btn = lv_imgbtn_create(content, NULL); + lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_ANSWER_BTN); + lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_ANSWER_BTN); + lv_obj_set_event_cb(btn, mmi_vc_hook_action); + lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_VC_INCOMING_HOOK_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET); +} + +static void mmi_vc_ui_connecting(lv_obj_t * content) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + + LV_ASSERT_MEM(ext); + if(ext == NULL) { + return; + } + lv_obj_t * label; + + // label ringing + label = lv_label_create(content, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_label_set_text_id(label, WATCH_TEXT_ID_CONNECTING); + lv_obj_set_click(label, false); + lv_obj_align(label, content, LV_ALIGN_IN_TOP_MID, 0, 10); + ext->phone_status_label = label; + + // img + lv_obj_t * img = lv_img_create(content, NULL); + lv_img_set_src(img, ICON_VIDEO_CALL_CONTACT_PHOTO); + lv_obj_align(img, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); + lv_obj_set_click(img, false); + + // name + label = lv_label_create(content, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL); + lv_obj_set_width(label, lv_obj_get_width(content) - 20); + if(strlen(s_video_call_params.name) > 0) + { + lv_label_set_text(label, s_video_call_params.name); + } + else + { + lv_label_set_text(label, s_video_call_params.number); + } +#if USE_LV_WATCH_UI_240_280 + lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); +#else + lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); +#endif + lv_obj_set_click(label, false); + + // btn ring off + lv_obj_t * btn = lv_imgbtn_create(content, NULL); + lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN); + lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN); + lv_obj_set_event_cb(btn, mmi_vc_ring_off_action); + lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_MID, 0, MMI_VC_RING_OFF_BTN_Y_OFFSET); +} + +static void mmi_vc_ui_connected(lv_obj_t * content) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + if(ext == NULL) + { + return; + } + + lv_obj_t * label; + lv_obj_t * btn; + hal_rtc_t rtc_curr = {0}; // current rtc time + Hal_Rtc_Gettime(&rtc_curr); + + if(s_video_call_params.call_type == MODEM_VIDEO_CALL_TYPE_VOICE) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + ext->connect_start_time = time_to_seconds(&rtc_curr); + + ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_NULL; + + //lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_style_transp); + lv_obj_t * img = lv_img_create(content, NULL); + lv_img_set_src(img, ICON_VIDEO_CALL_CONTACT_PHOTO); + lv_obj_align(img, content, LV_ALIGN_IN_TOP_MID, 0, 30); + lv_obj_set_click(img, false); + + // name + label = lv_label_create(content, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL); + lv_obj_set_width(label, lv_obj_get_width(content) - 20); + if(strlen(s_video_call_params.name) > 0) + { + lv_label_set_text(label, s_video_call_params.name); + } + else + { + lv_label_set_text(label, s_video_call_params.number); + } + lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); + lv_obj_set_click(label, false); + + //duration + lv_obj_t * time_label = lv_label_create(content, NULL); + lv_obj_add_style(time_label, LV_OBJ_PART_MAIN, &lv_watch_font20); + lv_label_set_align(time_label, LV_LABEL_ALIGN_CENTER); + lv_label_set_text(time_label, "00:00"); + lv_obj_set_click(time_label, false); + lv_obj_set_base_dir(time_label, LV_BIDI_DIR_LTR); + lv_obj_align(time_label, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); + ext->phone_status_label = time_label; + + //btn volume + btn = lv_imgbtn_create(content, NULL); + lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VOLUME_BTN); + lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VOLUME_BTN); + lv_obj_set_event_cb(btn, voip_volume_btn_action); + lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_LEFT, MMI_VC_CALLING_VOLUME_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET); //20, -50); + + //btn ring off + btn = lv_imgbtn_create(content, NULL); + lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN); + lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN); + lv_obj_set_event_cb(btn, mmi_vc_ring_off_action); + lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_VC_CALLING_RING_OFF_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET); //-20, -50); + + //watch_set_suspend_enable(false, ACT_ID_VOIPPHONE, 0); + } + else + { + lv_obj_t * canvas; + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: format=%d\n", __FUNCTION__, __LINE__, ext->voiph263fmt); + + ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_REMOTE; + if((ext->voiph263fmt == VOIP_H263_FMT_SQCIF) || (ext->voiph263fmt == VOIP_H263_FMT_QCIF)) + { + ext->connect_start_time = time_to_seconds(&rtc_curr); + + /*Create the canvas object*/ + canvas = lv_canvas_create(content, NULL); + lv_obj_set_click(canvas, true); + lv_obj_set_event_cb(canvas, canvas_button_hidden_event_cb); + video_call_add_element(canvas); + ext->canvas = canvas; + + lv_obj_align(canvas, content, LV_ALIGN_IN_TOP_MID, 0, 0); + /*Assign the buffer to the canvas*/ + lv_img_set_src(canvas, ICON_BACKGROUND); + voip_signal_check_start(ext); + + // duration + label = lv_label_create(canvas, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_label_set_text(label, "00:00"); + lv_obj_set_click(label, false); + lv_obj_set_base_dir(label, LV_BIDI_DIR_LTR); + lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 0); + ext->phone_status_label = label; + + // signal weak notification + label = lv_label_create(canvas, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26); + lv_label_set_text_id(label, WATCH_TEXT_ID_SIGNAL_WEAK); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_obj_align(label, canvas, LV_ALIGN_CENTER, 0, -10); + lv_obj_set_click(label, false); + lv_obj_set_hidden(label, true); + ext->signal_weak_label = label; + + // btn volume + btn = lv_imgbtn_create(canvas, NULL); + lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VOLUME_BTN); + lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VOLUME_BTN); + lv_obj_set_event_cb(btn, voip_volume_btn_action); + lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_LEFT, MMI_VC_CALLING_VOLUME_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET); + + // btn switch video + //btn = lv_imgbtn_create(canvas, NULL); + //lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_SETTING_VOLTE); + //lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_SETTING_VOLTE); + //lv_obj_set_event_cb(btn, voip_local_remote_switch_action); + //lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_MID, 0, 0); + + // btn ring off + btn = lv_imgbtn_create(canvas, NULL); + lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN); + lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN); + lv_obj_set_event_cb(btn, mmi_vc_ring_off_action); + lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_VC_CALLING_RING_OFF_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET); + } + else if((ext->voiph263fmt == VOIP_H263_FMT_CIF) + || (ext->voiph263fmt == VOIP_H263_FMT_4CIF) + || (ext->voiph263fmt == VOIP_H263_FMT_16CIF) + || (ext->voiph263fmt == VOIP_H263_FMT_OTHER)) + { + /*Create the canvas object*/ + canvas = lv_canvas_create(content, NULL); + lv_obj_set_click(canvas, true); + lv_obj_set_event_cb(canvas, canvas_button_hidden_event_cb); + video_call_add_element(canvas); + ext->canvas = canvas; + + /*Assign the buffer to the canvas*/ + lv_img_set_src(canvas, ICON_BACKGROUND); + voip_signal_check_start(ext); + + // duration + label = lv_label_create(canvas, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_label_set_text(label, "00:00"); + lv_obj_set_click(label, false); + lv_obj_set_base_dir(label, LV_BIDI_DIR_LTR); + lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 0); + ext->phone_status_label = label; + ext->connect_time = label; + + // signal weak notification + label = lv_label_create(canvas, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26); + lv_label_set_text_id(label, WATCH_TEXT_ID_SIGNAL_WEAK); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_obj_align(label, canvas, LV_ALIGN_CENTER, 0, -10); + lv_obj_set_click(label, false); + lv_obj_set_hidden(label, true); + ext->signal_weak_label = label; + + // btn volume + btn = lv_imgbtn_create(canvas, NULL); + lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VOLUME_BTN); + lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VOLUME_BTN); + lv_obj_set_event_cb(btn, voip_volume_btn_action); + lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_LEFT, MMI_VC_CALLING_VOLUME_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET); + lv_obj_add_style(btn, LV_OBJ_PART_MAIN, &lv_watch_style_transp); + ext->volume_button = btn; + + // btn switch video + btn = lv_imgbtn_create(canvas, NULL); + //lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_SETTING_VOLTE); + //lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_SETTING_VOLTE); + //lv_obj_set_event_cb(btn, voip_local_remote_switch_action); + //lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_MID, 0, -20); + //lv_obj_add_style(btn, LV_OBJ_PART_MAIN, &lv_watch_style_transp); + ext->view_switch_button = btn; + + // btn ring off + btn = lv_imgbtn_create(canvas, NULL); + lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN); + lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN); + lv_obj_set_event_cb(btn, mmi_vc_ring_off_action); + lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_VC_CALLING_RING_OFF_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET); + lv_obj_add_style(btn, LV_OBJ_PART_MAIN, &lv_watch_style_transp); + ext->ring_off_button = btn; + + lv_obj_set_hidden(ext->connect_time, ext->canvas_button_hidden_flag); + lv_obj_set_hidden(ext->volume_button, ext->canvas_button_hidden_flag); + lv_obj_set_hidden(ext->view_switch_button, true); // lv_obj_set_hidden(ext->view_switch_button, ext->canvas_button_hidden_flag); + lv_obj_set_hidden(ext->ring_off_button, ext->canvas_button_hidden_flag); + } + + if(mmi_vc_call_get_obj()) { + lv_watch_obj_set_down_slide_cb(mmi_vc_call_get_obj(), voip_phone_down_slide_callback); + } + } +} + +static lv_obj_t * mmi_vc_ui_create(lv_obj_t * activity_obj) +{ + if(MMI_VC_UI_CONNECTED == s_vc_call_ui) + { + /* set speaker volume to nv when leaving activiry's slider */ + voip_set_volume_when_slider_act(); + } + + mmi_vc_call_screen_clean(); + + //lv_watch_png_cache_all_free(); + + if(activity_obj == NULL) + { + lv_watch_activity_ext_t activity_ext = {0}; + + activity_ext.actId = ACT_ID_VOIPPHONE; + activity_ext.create = NULL; // mmi_vc_ui_create; + activity_ext.prepare_destory = mmi_vc_ui_prepare_destory; + activity_obj = lv_watch_creat_activity_obj(&activity_ext); + if(NULL == activity_obj) + { + return NULL; + } + } + + lv_obj_t * obj = lv_watch_obj_create(activity_obj); + if(obj == NULL) + { + return NULL; + } + lv_watch_obj_set_anim_mode(obj, LV_WATCH_LEFT_OR_RIGHT_SLIDE_CALLBACK); + lv_watch_obj_set_left_slide_cb(obj, voip_phone_left_slide_callback); + lv_watch_obj_set_right_slide_cb(obj, voip_phone_right_slide_callback); + + lv_vc_call_obj_ext_t * ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_vc_call_obj_ext_t)); + if(ext == NULL) + { + return NULL; + } + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + ext->phone_status_label = NULL; + ext->phone_animation_obj = NULL; + ext->vc_ui = s_vc_call_ui; + ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_NULL; +#if ENABLE_VIDEO_SCALE == 0 + ext->voiph263fmt = VOIP_H263_FMT_QCIF; +#else + ext->voiph263fmt = VOIP_H263_FMT_OTHER; +#endif + + hal_rtc_t rtc_curr; // current rtc time + Hal_Rtc_Gettime(&rtc_curr); + ext->connect_start_time = time_to_seconds(&rtc_curr); + ext->connect_time = NULL; + ext->volume_button = NULL; + ext->view_switch_button = NULL; + ext->ring_off_button = NULL; + ext->canvas_button_hidden_flag = NOT_HIDDEN; + + /* content */ + lv_obj_t * content = lv_cont_create(obj, NULL); + lv_obj_set_size(content, lv_obj_get_width(obj), lv_obj_get_height(obj)); + //lv_cont_set_layout(content, LV_LAYOUT_COLUMN_MID); + lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_style_transp); + //lv_obj_set_style_local_bg_color(content, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); + lv_watch_obj_add_element(content); + lv_obj_set_click(content, false); + lv_obj_align(content, obj, LV_ALIGN_CENTER, 0, 0); + + switch(ext->vc_ui) + { + case MMI_VC_UI_INCOMING: + mmi_vc_ui_incoming(content); + //mmi_vc_ring_animation(ext->phone_status_label); + break; + + case MMI_VC_UI_DIALING: + mmi_vc_ui_dialing(content); + //mmi_vc_dialing_animation(ext->phone_status_label); + break; + + case MMI_VC_UI_CONNECTING: + mmi_vc_ui_connecting(content); + //mmi_vc_connecting_animation(ext->phone_status_label); + break; + + case MMI_VC_UI_CONNECTED: + mmi_vc_ui_connected(content); + mmi_vc_connected_animation(ext->phone_status_label); + break; + + default: + break; + } + + return obj; +} + +void mmi_ui_msg_update_vc_call_incoming(void) +{ +#ifdef __MMI_ZHSX_SUPPORT_HEALTH_SENSOR__ + if(true == mmi_health_measure_state_is_ui_measure()) + { + mmi_health_heart_rate_screen_clean(); + mmi_health_spo2_screen_clean(); + #ifdef __MMI_HEALTH_MEASURE_TEMPERATURE_SUPPORT__ + mmi_health_temperature_screen_clean(); + #endif + } +#endif + + lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VC_DIAL_BTN); + if(NULL != activity_obj) + { + lv_obj_del(activity_obj); + } + + s_vc_call_ui = MMI_VC_UI_INCOMING; + mmi_vc_ui_create(NULL); +} + +void mmi_vc_call_action_incoming(char * number, MODEM_VIDEO_CALL_TYPE type, char * t_ticket, char * t_tokens) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + if(AUDIO_CTRL_PRIORITY_2 == Hal_Audio_Manage_Start_Req(AUDIO_CTRL_PRIORITY_2, mmi_vc_audio_ctrl_callback)) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + mmi_vc_call_params_clean(); + s_video_call_params.call_type = type; + s_video_call_params.state = MMI_VIDEO_CALL_STATE_INCOMING; + strncpy(s_video_call_params.number, number, NV_WATCH_VC_CONTACT_NUMBER_LEN - 1); + uint8_t i = 0; + for(i = 0; i < s_vc_contact.total; i++) + { + if(0 == strncmp(s_video_call_params.number, s_vc_contact.number[i], strlen(s_video_call_params.number))) + { + strncpy(s_video_call_params.name, s_vc_contact.name[i], NV_WATCH_VC_CONTACT_NAME_LEN - 1); + break; + } + } + + memset(s_video_call_ticket, 0x0, MMI_WATCH_VC_TICKET_LEN); + strncpy(s_video_call_ticket, t_ticket, MMI_WATCH_VC_TICKET_LEN - 1); + + memset(s_video_call_tokens, 0x0, MMI_WATCH_VC_TOKENS_LEN); + strncpy(s_video_call_tokens, t_tokens, MMI_WATCH_VC_TOKENS_LEN - 1); + + // ring + uint8_t volume = 0; + #ifdef __MMI_USER_PROFILE_SUPPORT__ + volume = mmi_user_profile_current_mode_remind_volume_get(); + #else + volume = query_current_volume(); + #endif + if(!Hal_Set_BT_Audio_Path(volume)) + { + Hal_Call_Speaker(HAL_CALL_SPK_ON, volume); + } + Hal_NFFS_File_Play_Repeat(AUDIO_INCOMING_CALL, volume); + + // vibrate + if(true == mmi_watch_vibrate_is_permitted()) + { + Hal_Vibrator_Play_Repeat(); + } + + // + mmi_video_call_jrtc_config_init_01(s_video_call_tokens); + + mmi_watch_wake_up(); + + voip_rat_check_start(); + + // ui + mmi_ui_msg_action_vc_call_incoming(); + } +} + +bool mmi_vc_call_action_incoming_no_permission(void) +{ + if(true == mmi_active_screen_is_prohibit_interrupted() + || true == is_rat_gsm() + #ifdef __MMI_ZHSX_SUPPORT_DO_NOT_DISTURB__ + || true == mmi_watch_is_in_do_not_disturb_time() + #endif + || true == mmi_vc_is_in_call() + ) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + return true; + } + + return false; +} + +static void mmi_vc_call_connecting_timeout_cb(void * para) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED); +} + +void mmi_vc_call_action_connecting(void) +{ + if(MMI_VIDEO_CALL_STATE_CALLING == s_video_call_params.state + || MMI_VIDEO_CALL_STATE_CONNECTING == s_video_call_params.state + ) + { + return; + } + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + s_video_call_params.state = MMI_VIDEO_CALL_STATE_CONNECTING; + + // stop timer + mmi_vc_all_timer_stop(); + + // stop playing tone + Hal_Tone_Play_End(); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2); + + if(NULL == s_video_call_params.connecting_timer_id) + { + s_video_call_params.connecting_timer_id = Hal_Timer_Start(MMI_VC_CONNECTING_TIMEOUT, mmi_vc_call_connecting_timeout_cb, NULL, 0); + } + + s_vc_call_ui = MMI_VC_UI_CONNECTING; + mmi_vc_ui_create(NULL); +} + +void mmi_vc_call_action_connected(void) +{ + if(MMI_VIDEO_CALL_STATE_CALLING == s_video_call_params.state) + { + return; + } + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + s_video_call_params.state = MMI_VIDEO_CALL_STATE_CALLING; + + // stop timer + mmi_vc_all_timer_stop(); + + // stop playing tone + Hal_Tone_Play_End(); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2); + + Hal_Set_Voice_Call_Status(VOICE_CALL_START); + + s_vc_call_ui = MMI_VC_UI_CONNECTED; + mmi_vc_ui_create(NULL); +} + +static void mmi_vc_call_dialing_timeout_cb(void * para) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED); +} + +void mmi_vc_call_action_dialing_ext(char * t_tokens, char * t_ticket) +{ + if(MMI_VIDEO_CALL_STATE_DIALING != s_video_call_params.state) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return; + } + + memset(s_video_call_ticket, 0x0, MMI_WATCH_VC_TICKET_LEN); + strncpy(s_video_call_ticket, t_ticket, MMI_WATCH_VC_TICKET_LEN - 1); + + memset(s_video_call_tokens, 0x0, MMI_WATCH_VC_TOKENS_LEN); + strncpy(s_video_call_tokens, t_tokens, MMI_WATCH_VC_TOKENS_LEN - 1); + + mmi_video_call_jrtc_config_init_01(s_video_call_tokens); + int8_t ret = mmi_video_call_dial_req(s_video_call_params.call_type, s_video_call_params.number, s_video_call_ticket); + if(0 > ret) + { + mmi_vc_call_dialing_timeout_cb(NULL); + } +} + +void mmi_vc_call_action_dialing(char * number, MODEM_VIDEO_CALL_TYPE type) +{ + // check call state + if(MMI_VIDEO_CALL_STATE_NONE != s_video_call_params.state) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, s_video_call_params.state); + return; + } + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__, number, type); + + // stop timer + mmi_vc_all_timer_stop(); + + mmi_vc_call_params_clean(); + s_video_call_params.state = MMI_VIDEO_CALL_STATE_DIALING; + s_video_call_params.call_type = type; + strcpy(s_video_call_params.number, number); + uint8_t i = 0; + for(i = 0; i < s_vc_contact.total; i++) + { + if(0 == strncmp(s_video_call_params.number, s_vc_contact.number[i], strlen(s_video_call_params.number))) + { + strncpy(s_video_call_params.name, s_vc_contact.name[i], NV_WATCH_VC_CONTACT_NAME_LEN - 1); + break; + } + } + + mmi_protocol_fzd_action_VC_CALL_REQUEST(s_video_call_params.number, s_video_call_params.call_type); + s_video_call_params.dialing_timer_id = Hal_Timer_Start(MMI_VC_DIALING_TIMEOUT, mmi_vc_call_dialing_timeout_cb, NULL, 0); + + voip_rat_check_start(); + + s_vc_call_ui = MMI_VC_UI_DIALING; + mmi_vc_ui_create(NULL); + + Hal_Audio_Manage_Start_Req(AUDIO_CTRL_PRIORITY_2, mmi_vc_audio_ctrl_callback); + Hal_Set_Voice_Call_Status(VOICE_CALL_START); +} + +static void mmi_vc_main_prepare_destory(lv_obj_t * activity_obj) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_watch_png_cache_all_free(); + + if(NULL != fail_timer_id) + { + Hal_Timer_Stop(fail_timer_id); + fail_timer_id = NULL; + } +} + +void mmi_vc_call_fail_timeout_cb(void *para) +{ + mmi_vc_main_prepare_destory(NULL); +} + +static void mmi_vc_call_action_no_permission(void) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_obj_t * obj = lv_watch_get_activity_obj(ACT_ID_VOIP_PHONEBOOK); + + lv_obj_t * cont = lv_cont_create(obj, NULL); + lv_cont_set_fit(cont, LV_FIT_NONE); + lv_obj_set_size(cont, lv_obj_get_width(obj), lv_obj_get_height(obj)); + lv_obj_set_style_local_bg_color(cont, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); + lv_cont_set_layout(cont, LV_LAYOUT_OFF); + lv_obj_set_click(cont, false); + + lv_obj_t * label = lv_label_create(cont, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_obj_set_click(label, false); + lv_label_set_text_id(label, WATCH_TEXT_ID_DEVICE_NO_NETWORK); // WATCH_TEXT_ID_NO_SIM_OR_NETWORK); // WATCH_TEXT_ID_NO_CONTACTS_OR_NETWORK); + lv_obj_align(label, cont, LV_ALIGN_CENTER, 0, 0); + + fail_timer_id = Hal_Timer_Start(2*1000, mmi_vc_call_fail_timeout_cb, NULL, FALSE); +} + +static void mmi_vc_voice_btn_action(lv_obj_t * btn, lv_event_t e) +{ + if(LV_EVENT_CLICKED != e) + { + return; + } + + if(true == mmi_vc_is_in_call()) + { + return; + } + + lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VC_DIAL_BTN); + if(NULL != activity_obj) + { + lv_obj_del(activity_obj); + } + uint8_t index = s_vc_contact_selected_index; + + if(true == mmi_vc_check_mo_permission()) + { + mmi_vc_call_action_dialing(s_vc_contact.number[index], MODEM_VIDEO_CALL_TYPE_VOICE); + } + else + { + mmi_vc_call_action_no_permission(); + } +} + +static void mmi_vc_video_btn_action(lv_obj_t * btn, lv_event_t e) +{ + if(LV_EVENT_CLICKED != e) + { + return; + } + + if(true == mmi_vc_is_in_call()) + { + return; + } + + lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VC_DIAL_BTN); + if(NULL != activity_obj) + { + lv_obj_del(activity_obj); + } + uint8_t index = s_vc_contact_selected_index; + + if(true == mmi_vc_check_mo_permission()) + { + mmi_vc_call_action_dialing(s_vc_contact.number[index], MODEM_VIDEO_CALL_TYPE_VIDEO); + } + else + { + mmi_vc_call_action_no_permission(); + } +} + +static void mmi_vc_dial_btn_screen_prepare_destory(lv_obj_t * activity_obj) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_watch_png_cache_all_free(); +} + +static lv_obj_t * mmi_vc_dial_btn_screen_create(lv_obj_t * activity_obj) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + if(activity_obj == NULL) + { + lv_watch_activity_ext_t activity_ext = {0}; + + activity_ext.actId = ACT_ID_VC_DIAL_BTN; + activity_ext.create = mmi_vc_dial_btn_screen_create; + activity_ext.prepare_destory = mmi_vc_dial_btn_screen_prepare_destory; + activity_obj = lv_watch_creat_activity_obj(&activity_ext); + if(NULL == activity_obj) + return NULL; + } + + lv_obj_t * obj = lv_watch_obj_create(activity_obj); + if(NULL == obj) + return NULL; + + lv_obj_t * cont = lv_cont_create(obj, NULL); + lv_cont_set_fit(cont, LV_FIT_NONE); + lv_obj_set_size(cont, LV_HOR_RES, LV_VER_RES); // lv_obj_get_width(obj), lv_obj_get_height(obj)); + lv_obj_set_style_local_bg_color(cont, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); + lv_cont_set_layout(cont, LV_LAYOUT_OFF); + lv_obj_set_click(cont, false); + + lv_obj_t * voicebtn = lv_imgbtn_create(cont, NULL); + lv_imgbtn_set_src(voicebtn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VOICE_BTN); + lv_imgbtn_set_src(voicebtn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VOICE_BTN); +#ifdef USE_LV_WATCH_UI_CIRCLE + lv_obj_align(voicebtn, cont, LV_ALIGN_IN_LEFT_MID, 5, 0); +#else + lv_obj_align(voicebtn, cont, LV_ALIGN_IN_TOP_MID, 0, 10); +#endif + lv_obj_set_event_cb(voicebtn, mmi_vc_voice_btn_action); + + lv_obj_t * videobtn = lv_imgbtn_create(cont, NULL); + lv_imgbtn_set_src(videobtn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VIDEO_BTN); + lv_imgbtn_set_src(videobtn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VIDEO_BTN); +#ifdef USE_LV_WATCH_UI_CIRCLE + lv_obj_align(videobtn, cont, LV_ALIGN_IN_RIGHT_MID, -5, 0); +#else + lv_obj_align(videobtn, cont, LV_ALIGN_IN_BOTTOM_MID, 0, -10); +#endif + lv_obj_set_event_cb(videobtn, mmi_vc_video_btn_action); + + return obj; +} + +static void mmi_vc_contact_event_cb(lv_obj_t * btn, lv_event_t e) +{ + if(LV_EVENT_CLICKED != e) + { + return; + } + + if(true == mmi_vc_is_in_call()) + { + return; + } + + s_vc_contact_selected_index = lv_watch_get_free_num(btn); + mmi_vc_dial_btn_screen_create(NULL); +} + +static lv_obj_t * mmi_vc_contact_list_create(lv_obj_t * obj) +{ + /*Allocate the object type specific extended data*/ + lv_vc_contact_list_obj_ext_t * ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_vc_contact_list_obj_ext_t)); + /*ext realloc based on watch_obj_ext, do not memeset it*/ + if(NULL == ext) + { + return NULL; + } + + //ext->title = NULL; + ext->list = NULL; + + /* content */ + lv_obj_t * content = lv_cont_create(obj, NULL); + lv_cont_set_fit(content, LV_FIT_NONE); + lv_obj_set_size(content, lv_obj_get_width(obj), lv_obj_get_height(obj)); + lv_obj_add_style(content,LV_OBJ_PART_MAIN, &lv_watch_style_transp); + lv_obj_set_style_local_bg_color(content, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); + lv_cont_set_layout(content, LV_LAYOUT_OFF); // lv_cont_set_layout(content, LV_LAYOUT_COLUMN_MID); + lv_obj_set_click(content, false); + lv_obj_align(content, obj, LV_ALIGN_CENTER, 0, 0); + + lv_obj_t * label = lv_label_create(content, NULL); + lv_obj_set_size(label, LV_HOR_RES, 40); // 30); + lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font20_gray); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_label_set_text_id(label, WATCH_TEXT_ID_VIDEOCALL); + lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 10); + lv_obj_set_click(label, false); + //ext->title = label; + + lv_obj_t * list = lv_list_create(content, NULL); + if(list == NULL) + { + return NULL; + } + lv_watch_obj_add_element(list); + lv_watch_obj_add_element(lv_page_get_scrl(list)); + lv_obj_add_style(list, LV_LIST_PART_BG, &lv_watch_style_transp); + //lv_obj_add_style(list, LV_LIST_PART_SCROLLABLE, &lv_watch_style_transp); + //lv_obj_set_style_local_pad_top(list, LV_LIST_PART_SCROLLABLE, LV_STATE_DEFAULT, 4); + //lv_obj_set_style_local_pad_bottom(list, LV_LIST_PART_SCROLLABLE, LV_STATE_DEFAULT, 4); + lv_list_set_scrollbar_mode(list, LV_SCROLLBAR_MODE_OFF); // lv_page_set_scrollbar_mode(list, LV_SCROLLBAR_MODE_OFF); + lv_obj_set_width(list, lv_obj_get_width(content)); + lv_coord_t height = lv_obj_get_height(content) - 40; // lv_obj_get_height(label); + lv_obj_set_height(list, height); + lv_obj_align(list, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0); + lv_obj_set_click(list, false); + ext->list = list; + + int8_t i = 0; + lv_obj_t * btn; + + for(i = 0; i < s_vc_contact.total; i++) + { + char t_str[NV_WATCH_VC_CONTACT_NUMBER_LEN] = {0}; + + if(0 < strlen(s_vc_contact.name[i])) + strcpy(t_str, s_vc_contact.name[i]); + else + strcpy(t_str, s_vc_contact.number[i]); + + #if 0 + btn = lv_list_add_btn(list, NULL, NULL); + //lv_page_glue_obj(btn, true); + //lv_obj_add_protect(btn, LV_PROTECT_PRESS_LOST); + lv_obj_set_event_cb(btn, mmi_vc_contact_event_cb); + lv_watch_obj_add_element(btn); + + lv_obj_set_style_local_bg_color(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); + lv_obj_set_style_local_pad_top(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 5); + lv_obj_set_style_local_pad_bottom(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 5); + lv_obj_set_style_local_pad_left(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 15); + lv_obj_set_style_local_pad_right(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 15); + lv_obj_set_style_local_pad_inner(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 10); + + //label = lv_obj_get_child(btn, NULL); + //label = lv_list_get_btn_label(btn); + label = lv_label_create(btn, NULL); + //lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL); // LV_LABEL_LONG_SROLL_CIRC + lv_obj_set_width(label, lv_obj_get_width(btn)); + lv_label_set_text(label, t_str); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26); + lv_label_set_align(label, LV_LABEL_ALIGN_LEFT); + lv_obj_set_click(label, false); + //lv_obj_align(label, btn, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_watch_set_free_num(btn, i); + #else + + btn = lv_list_add_btn(list, NULL, NULL); + lv_btn_set_layout(btn, LV_LAYOUT_ROW_MID); + //lv_obj_set_event_cb(btn, mmi_vc_contact_event_cb); + //lv_watch_set_free_num(btn, i); + + lv_obj_t * cont = lv_cont_create(btn, NULL); + lv_cont_set_layout(cont, LV_LAYOUT_OFF); + lv_obj_set_width(cont, lv_obj_get_width(btn)); + lv_obj_set_height(cont, 56); // LV_VER_RES / 4); //lv_obj_get_height(btn)); + lv_obj_add_style(cont, LV_CONT_PART_MAIN, &lv_style_transp); + lv_page_glue_obj(cont, true); + lv_watch_obj_add_element(cont); + lv_obj_set_click(cont, true); + lv_obj_set_event_cb(cont, mmi_vc_contact_event_cb); + lv_watch_set_free_num(cont, i); + + label = lv_label_create(cont, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26); + lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL); + lv_obj_set_width(label, lv_obj_get_width(cont) - 40); + lv_label_set_text(label, t_str); + lv_obj_align(label, cont, LV_ALIGN_IN_LEFT_MID, 20, 0); + + lv_watch_obj_add_element(btn); + #endif + } + + return obj; +} + +static lv_obj_t * mmi_vc_main_create(lv_obj_t * activity_obj) +{ + if(activity_obj == NULL) + { + lv_watch_activity_ext_t activity_ext = {0}; + + activity_ext.actId = ACT_ID_VOIP_PHONEBOOK; + activity_ext.create = mmi_vc_main_create; + activity_ext.prepare_destory = mmi_vc_main_prepare_destory; + activity_obj = lv_watch_creat_activity_obj(&activity_ext); + if(NULL == activity_obj) + return NULL; + } + + lv_obj_t * obj = lv_watch_obj_create(activity_obj); + if(NULL == obj) + return NULL; + + if(false == mmi_vc_check_mo_permission()) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_obj_t * label = lv_label_create(obj, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_obj_set_click(label, false); + lv_label_set_text_id(label, WATCH_TEXT_ID_DEVICE_NO_NETWORK); // WATCH_TEXT_ID_NO_SIM_OR_NETWORK); // WATCH_TEXT_ID_NO_CONTACTS_OR_NETWORK); + lv_obj_align(label, obj, LV_ALIGN_CENTER, 0, -10); + } + else if(true != mmi_watch_tcp_connect_state_get() + || true != mmi_protocol_watch_bind_state_get() + ) + { + // not bind + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_obj_t * label = lv_label_create(obj, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_obj_set_click(label, false); + lv_label_set_text_id(label, WATCH_TEXT_ID_DEVICE_NOT_BIND); + lv_obj_align(label, obj, LV_ALIGN_CENTER, 0, -10); + } + else if(0 == s_vc_contact.total) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_obj_t * label = lv_label_create(obj, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_obj_set_click(label, false); + lv_label_set_text_id(label, WATCH_TEXT_ID_NO_CONTACTS); + lv_obj_align(label, obj, LV_ALIGN_CENTER, 0, -10); + } + else + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + mmi_vc_contact_list_create(obj); + } + + return obj; +} + +void mmi_video_call_create_event_cb(lv_obj_t * btn, lv_event_t e) +{ +#ifdef __VIDEO_CALL_TEST__ + nv_watch_vc_contact_t t_test_contact = + { + 3, + {"test001", "test002", "test003"}, + {"jrtc001", "jrtc002", "jrtc003"} + }; + + _lv_memcpy(&s_vc_contact, &t_test_contact, sizeof(nv_watch_vc_contact_t)); +#endif + + if(LV_EVENT_CLICKED == e) + { + lv_watch_png_cache_all_free(); + mmi_vc_main_create(NULL); + } + else if(LV_EVENT_LONG_PRESSED == e) + { + + } +} + + + +#else +//static lv_signal_cb_t ancestor_signal; +#if VIDEO_SIGNAL_CHECK +static lv_task_t * signal_check_task = NULL; +#endif +static lv_task_t * rat_check_task = NULL; + +static MMI_VIDEO_CALL_PARAMS_T s_video_call_params = {0}; +lv_color_t g_cbuf[canvas_width * canvas_heigh + 8] __attribute__((aligned(8))); + +static char s_hzch_vc_appkey[MMI_WATCH_VC_APPKEY_LEN] = {0}; +static char s_hzch_vc_secret[MMI_WATCH_VC_SECRET_LEN] = {0}; +static char s_hzch_vc_tokens[MMI_WATCH_VC_TOKENS_LEN] = {0}; +static char s_hzch_vc_number[MMI_WATCH_VC_NUMBER_LEN] = {0}; +static char s_hzch_vc_ticket[MMI_WATCH_VC_TICKET_LEN] = {0}; +static char s_hzch_vc_uid[MMI_WATCH_VC_UID_LEN] = {0}; + + +/********************** +* STATIC PROTOTYPES +**********************/ +static void voip_phone_left_slide_callback(lv_obj_t * obj); +static void voip_phone_right_slide_callback(lv_obj_t * obj); +static void voip_phone_down_slide_callback(lv_obj_t * obj); +static void voip_volume_btn_action(lv_obj_t * obj, lv_event_t e); +static void voip_slider_action(lv_obj_t * slider, lv_event_t e); +static void voip_phone_obj_hide_anim_end(lv_anim_t * anim); +static void voip_anim_fp_dialing_ring(lv_obj_t * obj, int32_t x); +static void voip_set_volume_when_slider_act(void); +static void voip_local_remote_switch_action(lv_obj_t * btn, lv_event_t e); +static void canvas_button_hidden_event_cb(lv_obj_t * obj, lv_event_t e); +static void voip_signal_check_start(void * ext); +static void voip_signal_check_stop(void); +static bool is_rat_gsm(void); +static void voip_rat_check_start(void); +static void voip_rat_check_stop(void); + + +void mmi_vc_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, priority); + + if(AUDIO_CTRL_PRIORITY_2 > priority) + { + lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE); + if(activity_obj == NULL) + { + return; + } + mmi_vc_activity_destroy_req(); + Hal_Vibrator_Play_End(); + Hal_Tone_Play_End(); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2); + } +} + +void * mmi_video_call_phone_get_video_buffer() +{ + return g_cbuf; +} + +/********************** +* STATIC FUNCTIONS +**********************/ +static lv_obj_t * mmi_vc_call_get_activity_obj(void) +{ + lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE); + + return(activity_obj); +} + +static lv_obj_t * mmi_vc_call_get_obj(void) +{ + lv_obj_t * watch_obj = NULL; + + lv_obj_t * activity_obj = mmi_vc_call_get_activity_obj(); + + if(activity_obj) + { + lv_watch_get_child_obj(activity_obj, lv_watch_obj_signal, &watch_obj); + } + + return(watch_obj); +} + +lv_vc_call_obj_ext_t * mmi_vc_call_get_ext(void) +{ + lv_vc_call_obj_ext_t * ext = NULL; + lv_obj_t * watch_obj = mmi_vc_call_get_obj(); + + if(watch_obj) + { + ext = lv_obj_get_ext_attr(watch_obj); + } + + return(ext); +} + +static void mmi_vc_call_params_clean(void) +{ + _lv_memset_00(&s_video_call_params, sizeof(MMI_VIDEO_CALL_PARAMS_T)); +} + +static void mmi_vc_call_screen_clean(void) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_obj_t * slider_activit_obj = lv_watch_get_activity_obj(ACT_ID_SLIDER); + + if(slider_activit_obj) + { + lv_obj_del(slider_activit_obj); + } + + lv_obj_t * activity_obj = mmi_vc_call_get_activity_obj(); + if(activity_obj) + { + lv_obj_del(activity_obj); + } +} + +static void voip_phone_left_slide_callback(lv_obj_t * obj) +{ + printf("%s %d\n", __FUNCTION__, __LINE__); + if((MMI_VIDEO_CALL_STATE_CALLING == s_video_call_params.state) + && (MODEM_VIDEO_CALL_TYPE_VIDEO == s_video_call_params.call_type)) + { + voip_local_remote_switch_action(NULL, LV_EVENT_CLICKED); + } +} + +static void voip_phone_right_slide_callback(lv_obj_t * obj) +{ + printf("%s %d\n", __FUNCTION__, __LINE__); + mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED); +} + +static void voip_phone_down_slide_callback(lv_obj_t * obj) +{ + printf("%s %d\n", __FUNCTION__, __LINE__); + voip_volume_btn_action(NULL, LV_EVENT_CLICKED); +} + +static void voip_slider_action(lv_obj_t * slider, lv_event_t e) +{ + if(e == LV_EVENT_VALUE_CHANGED) + { + printf("%s %d\n", __FUNCTION__, __LINE__); + + uint8_t v = lv_slider_get_value(slider); + + // set speaker volume + if(!Hal_Set_BT_Audio_Path((HAL_SPEAKER_GAIN)v)) + Hal_Call_Speaker(HAL_CALL_SPK_ON, (HAL_SPEAKER_GAIN)v); + s_video_call_params.speaker_volume = v; + } +} + +static void voip_volume_btn_action(lv_obj_t * obj, lv_event_t e) +{ + if(LV_EVENT_CLICKED != e) { + return; + } + + printf("%s %d\n", __FUNCTION__, __LINE__); + slider_create(NULL, SETTING_VOIP_SPEAKER, 40, voip_slider_action); +} + +static void mmi_vc_get_time_elaps(uint32_t last_time, char * str, int8_t size) +{ + hal_rtc_t rtc_curr; // current rtc time + uint32_t second_curr = 0; // seconds of current time + + Hal_Rtc_Gettime(&rtc_curr); + second_curr = time_to_seconds(&rtc_curr); + + uint32_t elaps = second_curr - last_time; + uint32_t seconds = elaps % 60; + uint32_t minutes = elaps / 60; + uint32_t hours = minutes / 60; + minutes = minutes % 60; + + if(hours == 0) + snprintf(str, size, "%.2d:%.2d", minutes, seconds); + else + snprintf(str, size, "%.2d:%.2d:%.2d", hours, minutes, seconds); +} + +static lv_obj_t * mmi_vc_ring_off_content_create(lv_obj_t * par) +{ + printf("%s %d\n", __FUNCTION__, __LINE__); + if(par == NULL) { + par = lv_scr_act(); + } + + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + LV_ASSERT_MEM(ext); + if(ext == NULL) { + return(NULL); + } + + lv_obj_t * obj = lv_obj_create(par, NULL); + LV_ASSERT_MEM(obj); + if(obj == NULL) { + return(NULL); + } + lv_obj_set_size(obj, lv_obj_get_width(par), lv_obj_get_height(par)); + lv_obj_add_style(obj, LV_OBJ_PART_MAIN, &lv_style_transp_tight); + + lv_obj_t * content = lv_cont_create(obj, NULL); + LV_ASSERT_MEM(content); + if(content == NULL) { + return(NULL); + } + lv_obj_set_style_local_radius(content, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 15); + //lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_cont_opa1); + lv_obj_set_size(content, LV_HOR_RES - 40, 50); + lv_obj_align(content, obj, LV_ALIGN_CENTER, 0, -10); + lv_cont_set_layout(content, LV_LAYOUT_CENTER); + lv_obj_set_click(content, false); + + lv_obj_t * label = lv_label_create(content, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26); // &lv_watch_font20); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + + if(is_rat_gsm()) + { + lv_label_set_text_id(label, WATCH_TEXT_ID_NETWORK_WRONG); + } + else + { + if(ext->vc_ui == MMI_VC_UI_CONNECTED) + { + char tmp[20] = ""; + char str[30] = ""; + mmi_vc_get_time_elaps(ext->connect_start_time, tmp, 20); + snprintf(str, 30, "%s(%s)", (char *)lv_lang_get_text(WATCH_TEXT_ID_RING_OFF), tmp); + lv_label_set_text(label, str); + } + else + { + lv_label_set_text_id(label, WATCH_TEXT_ID_RING_OFF); + } + } + + lv_obj_set_click(label, false); + + return(obj); +} + +static void voip_anim_fp_connecting_ring(lv_obj_t * obj, int32_t x) +{ + if(obj != NULL) { + lv_obj_set_x(obj, x); + } +} + +static void mmi_vc_connecting_animation(lv_obj_t * par) +{ + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + + LV_ASSERT_MEM(ext); + if(ext == NULL) { + return; + } + + lv_obj_t * img = lv_img_create(mmi_vc_call_get_obj(), NULL); + lv_img_set_src(img, LV_SYMBOL_LOOP); + lv_obj_add_style(img, LV_OBJ_PART_MAIN, &lv_watch_image); + lv_obj_set_style_local_text_font(img, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, LV_THEME_WATCH_NIGHT_SYMBOL_NORMAL); + lv_obj_set_y(img, lv_obj_get_y(par) + lv_obj_get_y(lv_obj_get_parent(par))); + ext->phone_animation_obj = img; + + /*Create an animation to move the button continuously left to right*/ + lv_anim_t a; + lv_anim_path_t path; + lv_anim_value_t start = lv_obj_get_x(par) + lv_obj_get_width(par) + 6; + lv_anim_value_t end = start + 30; + + lv_anim_path_init(&path); + lv_anim_path_set_cb(&path, lv_anim_path_linear); + + lv_anim_init(&a); + lv_anim_set_var(&a, img); + lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)voip_anim_fp_connecting_ring); + lv_anim_set_path(&a, &path); + lv_anim_set_values(&a, start, end); + lv_anim_set_time(&a, 400); + lv_anim_set_playback_time(&a, 400); + lv_anim_set_playback_delay(&a, 0); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + lv_anim_set_repeat_delay(&a, 500); + + lv_anim_start(&a); +} + +static void voip_anim_fp_dialing_ring(lv_obj_t * obj, int32_t x) +{ + if(obj != NULL) { + lv_obj_set_x(obj, x); + } +} + +static void mmi_vc_dialing_animation(lv_obj_t * par) +{ + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + + LV_ASSERT_MEM(ext); + if(ext == NULL) { + return; + } + + lv_obj_t * img = lv_img_create(mmi_vc_call_get_obj(), NULL); + lv_img_set_src(img, LV_SYMBOL_RIGHT); + lv_obj_add_style(img, LV_OBJ_PART_MAIN, &lv_watch_image); + lv_obj_set_style_local_text_font(img, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, LV_THEME_WATCH_NIGHT_SYMBOL_NORMAL); + lv_obj_set_y(img, lv_obj_get_y(par) + lv_obj_get_y(lv_obj_get_parent(par))); + ext->phone_animation_obj = img; + + /*Create an animation to move the button continuously left to right*/ + lv_anim_t a; + lv_anim_path_t path; + lv_anim_value_t start = lv_obj_get_x(par) + lv_obj_get_width(par) + 6; + lv_anim_value_t end = start + 30; + + lv_anim_path_init(&path); + lv_anim_path_set_cb(&path, lv_anim_path_linear); + + lv_anim_init(&a); + lv_anim_set_var(&a, img); + lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)voip_anim_fp_dialing_ring); + lv_anim_set_path(&a, &path); + lv_anim_set_values(&a, start, end); + lv_anim_set_time(&a, 400); + lv_anim_set_playback_time(&a, 400); + lv_anim_set_playback_delay(&a, 0); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + lv_anim_set_repeat_delay(&a, 500); + + lv_anim_start(&a); +} + +static void mmi_vc_ring_animation(lv_obj_t * par) +{ + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + + LV_ASSERT_MEM(ext); + if(ext == NULL) { + return; + } + + lv_obj_t * img = lv_img_create(mmi_vc_call_get_obj(), NULL); + lv_img_set_src(img, LV_SYMBOL_LEFT); + lv_obj_add_style(img, LV_OBJ_PART_MAIN, &lv_watch_image); + lv_obj_set_style_local_text_font(img, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, LV_THEME_WATCH_NIGHT_SYMBOL_NORMAL); + lv_obj_set_y(img, lv_obj_get_y(par) + lv_obj_get_y(lv_obj_get_parent(par))); + ext->phone_animation_obj = img; + + /*Create an animation to move the button continuously left to right*/ + lv_anim_t a; + lv_anim_path_t path; + lv_anim_value_t start = lv_obj_get_x(par) - 20; + lv_anim_value_t end = start - 30; + + lv_anim_path_init(&path); + lv_anim_path_set_cb(&path, lv_anim_path_linear); + + lv_anim_init(&a); + lv_anim_set_var(&a, img); + lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)voip_anim_fp_dialing_ring); + lv_anim_set_path(&a, &path); + lv_anim_set_values(&a, start, end); + lv_anim_set_time(&a, 400); + lv_anim_set_playback_time(&a, 400); + lv_anim_set_playback_delay(&a, 0); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + lv_anim_set_repeat_delay(&a, 500); + + lv_anim_start(&a); +} + +static void mmi_vc_anim_fp_connected(lv_anim_t * anim) +{ + lv_obj_t * obj = (lv_obj_t *)anim->var; + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + + LV_ASSERT_MEM(ext); + if(ext == NULL) { + return; + } + + char str[20] = ""; + mmi_vc_get_time_elaps(ext->connect_start_time, str, 20); + if(obj) { + lv_label_set_text(obj, str); + } +} + +static void mmi_vc_connected_animation(lv_obj_t * obj) +{ + lv_anim_t a; + lv_anim_path_t path; + + lv_anim_path_init(&path); + lv_anim_path_set_cb(&path, lv_anim_path_step); + + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_start_cb(&a, (lv_anim_ready_cb_t)mmi_vc_anim_fp_connected); + lv_anim_set_path(&a, &path); + lv_anim_set_time(&a, 1); + lv_anim_set_playback_time(&a, 0); + lv_anim_set_playback_delay(&a, 0); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + lv_anim_set_repeat_delay(&a, 1000); + + lv_anim_start(&a); +} + +static void mmi_vc_ring_off_obj_hide_anim_end(lv_anim_t * anim) +{ + (void)anim; + printf("%s %d\n", __FUNCTION__, __LINE__); + + mmi_vc_call_screen_clean(); +} + +void mmi_vc_ring_off_screen(void) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + // stop playing tone + Hal_Tone_Play_End(); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2); + + // stop timer + mmi_vc_all_timer_stop(); + + // + voip_signal_check_stop(); + voip_rat_check_stop(); + + // create ring off UI + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + if(NULL != ext) + { + //if(ext->vc_ui == MMI_VC_UI_INCOMING || ext->vc_ui == MMI_VC_UI_DIALING) + { + if(ext->phone_status_label) + { + //lv_label_set_text(ext->phone_status_label, ""); + lv_obj_set_hidden(ext->phone_status_label, true); + } + } + mmi_vc_ring_off_content_create(mmi_vc_call_get_obj()); + + if(ext->phone_animation_obj) + { + lv_obj_del(ext->phone_animation_obj); + ext->phone_animation_obj = NULL; + } + + /* set speaker volume to nv when leaving activiry's slider */ + voip_set_volume_when_slider_act(); + + /* phone cleanup when anim end*/ + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, mmi_vc_call_get_obj()); + lv_anim_set_ready_cb(&a, (lv_anim_ready_cb_t)mmi_vc_ring_off_obj_hide_anim_end); + lv_anim_set_time(&a, MMI_VC_RING_OFF_ANIM_TIMEOUT); + lv_anim_start(&a); + } + + if(MMI_MODEM_CALL_STATE_NULL != phone_get_call_state()) + { + printf("%s tele call is on going, keep para of audio\n", __FUNCTION__); + Hal_Set_Voice_Call_Status(VOICE_CALL_END); + Hal_Disconnect_BT_Audio_Path(); + } + watch_wakeup_time_reset(); + + mmi_vc_call_params_clean(); +} + +static bool mmi_vc_check_mo_permission(void) +{ + if((!watch_modem_sim_present_check_req()) + || (MMI_MODEM_SIGNAL_BAR_0 == watch_modem_get_signal_bar_req()) +// || (MODEM_VIDEO_CALL_REG_OK != watch_modem_video_call_get_reg_stat_req()) + || (is_rat_gsm()) + ) + { + return false; + } + + return true; +} + +static void voip_local_remote_switch_action(lv_obj_t * btn, lv_event_t e) +{ + if(LV_EVENT_CLICKED != e) { + return; + } + + printf("%s %d\n", __FUNCTION__, __LINE__); + lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE); + if(!activity_obj) { + return; + } + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + if(!ext) { + return; + } + if(ext->local_remote_switch_flag == VOIP_REMOTE_SWITCH_NULL) { + return; + } + if(ext->local_remote_switch_flag == VOIP_REMOTE_SWITCH_REMOTE) { + ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_LOCAL; + } else { + ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_REMOTE; + } +} + +static lv_res_t video_call_element_signal_func(lv_obj_t * element, lv_signal_t sign, void * param) +{ + lv_res_t res; + + //printf("%s, sign=%d\n", __FUNCTION__, sign); + /* if not click signs, invoke ancient handler and return */ + if(sign != LV_SIGNAL_PRESSING && sign != LV_SIGNAL_PRESSED && sign != LV_SIGNAL_RELEASED && sign != LV_SIGNAL_PRESS_LOST) { + /* Include the ancient signal function */ + lv_signal_cb_t sign_func = (lv_signal_cb_t)(lv_obj_get_user_data(element).user_data); + res = sign_func(element, sign, param); + if(res != LV_RES_OK) { + return(res); + } + + return(LV_RES_OK); + } + + lv_obj_t * obj = lv_obj_get_parent(element); + while(obj) { + if(lv_obj_get_signal_cb(obj) != lv_watch_obj_signal) { + obj = lv_obj_get_parent(obj); + } else { + break; + } + } + if(obj == NULL) { + return(LV_RES_INV); + } + + res = lv_watch_obj_signal(obj, sign, param); + if(res != LV_RES_OK) { + return(res); + } + + /* Include the ancient signal function */ + lv_signal_cb_t sign_func = (lv_signal_cb_t)(lv_obj_get_user_data(element).user_data); + res = sign_func(element, sign, param); + if(res != LV_RES_OK) { + return(res); + } + + return(LV_RES_OK); +} /* video_call_element_signal_func */ + +static void video_call_add_element(lv_obj_t * element) +{ + lv_watch_set_free_ptr(element, lv_obj_get_signal_cb(element)); + lv_obj_set_signal_cb(element, video_call_element_signal_func); + lv_obj_add_protect(element, LV_PROTECT_PRESS_LOST | LV_PROTECT_CLICK_FOCUS); +} + +static void canvas_button_hidden_event_cb(lv_obj_t * obj, lv_event_t e) +{ + if(LV_EVENT_CLICKED == e) + { + printf("%s %d\n", __FUNCTION__, __LINE__); + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + if(!ext) { + return; + } + if(ext->canvas_button_hidden_flag == NOT_HIDDEN) { + ext->canvas_button_hidden_flag = HIDDEN; + } else { + ext->canvas_button_hidden_flag = NOT_HIDDEN; + } + + lv_obj_set_hidden(ext->connect_time, ext->canvas_button_hidden_flag); + lv_obj_set_hidden(ext->volume_button, ext->canvas_button_hidden_flag); + lv_obj_set_hidden(ext->view_switch_button, true); // lv_obj_set_hidden(ext->view_switch_button, ext->canvas_button_hidden_flag); + lv_obj_set_hidden(ext->ring_off_button, ext->canvas_button_hidden_flag); + } +} + +static void voip_set_volume_when_slider_act(void) +{ + printf("%s\n", __FUNCTION__); + if(lv_watch_get_activity_obj(ACT_ID_SLIDER)) { + if(MMI_VIDEO_CALL_STATE_NONE != s_video_call_params.state) { + uint8_t volume = mmi_vc_get_call_volume(); + printf("set nv, speaker volume is %d.\n", volume); + UI_NV_Write_Req(NV_SECTION_UI_PHONE, 0, 1, &volume); + } + } +} + +#if VIDEO_SIGNAL_CHECK +static void signal_check(lv_task_t *task) +{ + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + if(!ext) return; + + if((false == is_rat_gsm()) && + (watch_modem_get_signal_bar_req() < MMI_MODEM_SIGNAL_BAR_3)) { + lv_obj_set_hidden(ext->signal_weak_label, false); + } else { + lv_obj_set_hidden(ext->signal_weak_label, true); + } +} +#endif + +static void voip_signal_check_start(void * ext) +{ +#if VIDEO_SIGNAL_CHECK + if(NULL == signal_check_task) + signal_check_task = lv_task_create(signal_check, VIDEO_SIGNAL_CHECK_PERIOD, LV_TASK_PRIO_HIGH, NULL); +#endif +} + +static void voip_signal_check_stop(void) +{ +#if VIDEO_SIGNAL_CHECK + if(signal_check_task) { + lv_task_del(signal_check_task); + signal_check_task = NULL; + } +#endif +} + +static bool is_rat_gsm(void) +{ + MMI_MODEM_PLMN_RAT rat; + + watch_modem_get_operator_req(&rat); + if(MMI_MODEM_PLMN_RAT_GSM == rat) + return true; + else + return false; +} + +static void rat_check(lv_task_t *task) +{ + if(is_rat_gsm()) { + mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED); + } +} + +static void voip_rat_check_start(void) +{ + if(NULL == rat_check_task) + rat_check_task = lv_task_create(rat_check, VIDEO_RAT_CHECK_PERIOD, LV_TASK_PRIO_HIGH, NULL); +} + +static void voip_rat_check_stop(void) +{ + if(rat_check_task) { + lv_task_del(rat_check_task); + rat_check_task = NULL; + } +} + +void voip_fps_check(int8_t fps) +{ + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + if(NULL != ext) { + if((VIDEO_CALL_FPS_CHECK_LIMIT >= fps) && (0 != fps)) { + printf("%s %d\n", __FUNCTION__, fps); + if(lv_obj_get_hidden(ext->signal_weak_label) == false) return; + lv_obj_set_hidden(ext->signal_weak_label, false); + } else { + if(lv_obj_get_hidden(ext->signal_weak_label) == true) return; + lv_obj_set_hidden(ext->signal_weak_label, true); + } + } +} + + + + +static nv_watch_vc_contact_t s_vc_contact = {0}; +static TIMER_ID fail_timer_id = NULL; +static MMI_VIDEO_CALL_UI_E s_vc_call_ui = MMI_VC_UI_INVALID; + +MMI_VIDEO_CALL_STATE_E mmi_video_call_params_state_get(void) +{ + return (s_video_call_params.state); +} + +MODEM_VIDEO_CALL_TYPE mmi_video_call_params_type_get(void) +{ + return (s_video_call_params.call_type); +} + +void mmi_video_call_contact_nv_read(void) +{ + +} + +bool mmi_vc_is_in_call(void) +{ + if(MMI_VIDEO_CALL_STATE_NONE == s_video_call_params.state || MMI_VIDEO_CALL_STATE_INVALID == s_video_call_params.state) + return false; + + return true; +} + +// +void mmi_vc_call_operate_send_to_server(void) +{ + mmi_protocol_fzd_action_VC_CALL_CANCEL(s_hzch_vc_number, s_hzch_vc_ticket); +} + +void mmi_vc_ring_off_timer_stop(void) +{ + if(NULL != s_video_call_params.ring_off_timer_id) + { + Hal_Timer_Stop(s_video_call_params.ring_off_timer_id); + s_video_call_params.ring_off_timer_id = NULL; + } +} + +void mmi_vc_dialing_timer_stop(void) +{ + if(NULL != s_video_call_params.dialing_timer_id) + { + Hal_Timer_Stop(s_video_call_params.dialing_timer_id); + s_video_call_params.dialing_timer_id = NULL; + } +} + +void mmi_vc_connecting_timer_stop(void) +{ + if(NULL != s_video_call_params.connecting_timer_id) + { + Hal_Timer_Stop(s_video_call_params.connecting_timer_id); + s_video_call_params.connecting_timer_id = NULL; + } +} + +void mmi_vc_all_timer_stop(void) +{ + mmi_vc_dialing_timer_stop(); + mmi_vc_connecting_timer_stop(); + mmi_vc_ring_off_timer_stop(); +} + +static void mmi_vc_ui_prepare_destory(lv_obj_t * activity_obj) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_watch_png_cache_all_free(); + + // ring off + mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED); +} + +void mmi_vc_ring_off_action(lv_obj_t * btn, lv_event_t e) +{ + if(LV_EVENT_CLICKED != e) + { + return; + } + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, s_video_call_params.state); + + // stop playing tone + Hal_Vibrator_Play_End(); + Hal_Tone_Play_End(); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2); + + // + voip_signal_check_stop(); + voip_rat_check_stop(); + + // stop timer + mmi_vc_all_timer_stop(); + + switch(s_video_call_params.state) + { + case MMI_VIDEO_CALL_STATE_NONE: + case MMI_VIDEO_CALL_STATE_INVALID: + // do noting + break; + + case MMI_VIDEO_CALL_STATE_INCOMING: + break; + + default: + mmi_video_call_hangup_req(TRUE); + break; + } + // watch_wakeup_time_reset(); + // watch_set_suspend_enable(true, ACT_ID_VOIPPHONE, 0); +} + +void mmi_ui_msg_update_vc_call_stop(void) +{ + mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED); +} + +void mmi_vc_call_action_call_stop(void) +{ + if(true != mmi_vc_is_in_call()) + { + return; + } + + mmi_watch_wake_up(); + mmi_ui_msg_action_vc_call_stop(); +} + + +void mmi_ui_msg_update_vc_call_referral(void) +{ + //mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED); +} + +void mmi_vc_call_action_call_referral(void) +{ + if(true != mmi_vc_is_in_call()) + { + return; + } + + mmi_watch_wake_up(); + //mmi_ui_msg_action_vc_call_stop(); +} + +static void mmi_vc_ui_dialing(lv_obj_t * content) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + if(ext == NULL) + { + return; + } + + // connecting + lv_obj_t * img = lv_img_create(content, NULL); + lv_img_set_src(img, ICON_VIDEO_CALL_WAITTING); + lv_obj_align(img, NULL, LV_ALIGN_CENTER, 0, 0); + lv_obj_set_click(img, false); + + lv_obj_t * btn = lv_btn_create(img, NULL); + lv_obj_set_size(btn, 80, 80); + //lv_obj_set_style_local_bg_color(btn_cancel, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_MAKE(0x47, 0xA6, 0xFF)); + //lv_obj_set_style_local_radius(btn_cancel, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 30); + //lv_obj_set_style_local_bg_color(btn_cancel, LV_BTN_PART_MAIN, LV_STATE_PRESSED, LV_COLOR_MAKE(0x47, 0xA6, 0xFF)); + //lv_obj_set_style_local_radius(btn_cancel, LV_BTN_PART_MAIN, LV_STATE_PRESSED, 30); + lv_obj_add_style(btn, LV_BTN_PART_MAIN, &lv_style_transp_fit); + lv_obj_align(btn, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, -10); + lv_obj_set_event_cb(btn, mmi_vc_ring_off_action); +} + +static void mmi_vc_ui_connecting(lv_obj_t * content) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + + LV_ASSERT_MEM(ext); + if(ext == NULL) { + return; + } + lv_obj_t * label; + + // label ringing + label = lv_label_create(content, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_label_set_text_id(label, WATCH_TEXT_ID_CONNECTING); + lv_obj_set_click(label, false); + lv_obj_align(label, content, LV_ALIGN_IN_TOP_MID, 0, 10); + ext->phone_status_label = label; + + // img + lv_obj_t * img = lv_img_create(content, NULL); + lv_img_set_src(img, ICON_VIDEO_CALL_CONTACT_PHOTO); + lv_obj_align(img, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); + lv_obj_set_click(img, false); + + // name + label = lv_label_create(content, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL); + lv_obj_set_width(label, lv_obj_get_width(content) - 20); + if(strlen(s_video_call_params.name) > 0) + { + lv_label_set_text(label, s_video_call_params.name); + } + else + { + lv_label_set_text(label, s_video_call_params.number); + } +#if USE_LV_WATCH_UI_240_280 + lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); +#else + lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); +#endif + lv_obj_set_click(label, false); + + // btn ring off + lv_obj_t * btn = lv_imgbtn_create(content, NULL); + lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN); + lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN); + lv_obj_set_event_cb(btn, mmi_vc_ring_off_action); + lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_MID, 0, MMI_VC_RING_OFF_BTN_Y_OFFSET); +} + +static void mmi_vc_ui_connected(lv_obj_t * content) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext(); + if(ext == NULL) + { + return; + } + + lv_obj_t * label; + lv_obj_t * btn; + hal_rtc_t rtc_curr = {0}; // current rtc time + Hal_Rtc_Gettime(&rtc_curr); + + if(s_video_call_params.call_type == MODEM_VIDEO_CALL_TYPE_VOICE) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + ext->connect_start_time = time_to_seconds(&rtc_curr); + + ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_NULL; + + //lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_style_transp); + lv_obj_t * img = lv_img_create(content, NULL); + lv_img_set_src(img, ICON_VIDEO_CALL_CONTACT_PHOTO); + lv_obj_align(img, content, LV_ALIGN_IN_TOP_MID, 0, 30); + lv_obj_set_click(img, false); + + // name + label = lv_label_create(content, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL); + lv_obj_set_width(label, lv_obj_get_width(content) - 20); + if(strlen(s_video_call_params.name) > 0) + { + lv_label_set_text(label, s_video_call_params.name); + } + else + { + lv_label_set_text(label, s_video_call_params.number); + } + lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); + lv_obj_set_click(label, false); + + //duration + lv_obj_t * time_label = lv_label_create(content, NULL); + lv_obj_add_style(time_label, LV_OBJ_PART_MAIN, &lv_watch_font20); + lv_label_set_align(time_label, LV_LABEL_ALIGN_CENTER); + lv_label_set_text(time_label, "00:00"); + lv_obj_set_click(time_label, false); + lv_obj_set_base_dir(time_label, LV_BIDI_DIR_LTR); + lv_obj_align(time_label, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); + ext->phone_status_label = time_label; + + //btn volume + btn = lv_imgbtn_create(content, NULL); + lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VOLUME_BTN); + lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VOLUME_BTN); + lv_obj_set_event_cb(btn, voip_volume_btn_action); + lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_LEFT, MMI_VC_CALLING_VOLUME_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET); //20, -50); + + //btn ring off + btn = lv_imgbtn_create(content, NULL); + lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN); + lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN); + lv_obj_set_event_cb(btn, mmi_vc_ring_off_action); + lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_VC_CALLING_RING_OFF_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET); //-20, -50); + + //watch_set_suspend_enable(false, ACT_ID_VOIPPHONE, 0); + } + else + { + lv_obj_t * canvas; + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: format=%d\n", __FUNCTION__, __LINE__, ext->voiph263fmt); + + ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_REMOTE; + if((ext->voiph263fmt == VOIP_H263_FMT_SQCIF) || (ext->voiph263fmt == VOIP_H263_FMT_QCIF)) + { + ext->connect_start_time = time_to_seconds(&rtc_curr); + + /*Create the canvas object*/ + canvas = lv_canvas_create(content, NULL); + lv_obj_set_click(canvas, true); + lv_obj_set_event_cb(canvas, canvas_button_hidden_event_cb); + video_call_add_element(canvas); + ext->canvas = canvas; + + lv_obj_align(canvas, content, LV_ALIGN_IN_TOP_MID, 0, 0); + /*Assign the buffer to the canvas*/ + lv_img_set_src(canvas, ICON_BACKGROUND); + voip_signal_check_start(ext); + + // duration + label = lv_label_create(canvas, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_label_set_text(label, "00:00"); + lv_obj_set_click(label, false); + lv_obj_set_base_dir(label, LV_BIDI_DIR_LTR); + lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 0); + ext->phone_status_label = label; + + // signal weak notification + label = lv_label_create(canvas, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26); + lv_label_set_text_id(label, WATCH_TEXT_ID_SIGNAL_WEAK); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_obj_align(label, canvas, LV_ALIGN_CENTER, 0, -10); + lv_obj_set_click(label, false); + lv_obj_set_hidden(label, true); + ext->signal_weak_label = label; + + // btn volume + btn = lv_imgbtn_create(canvas, NULL); + lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VOLUME_BTN); + lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VOLUME_BTN); + lv_obj_set_event_cb(btn, voip_volume_btn_action); + lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_LEFT, MMI_VC_CALLING_VOLUME_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET); + + // btn switch video + //btn = lv_imgbtn_create(canvas, NULL); + //lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_SETTING_VOLTE); + //lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_SETTING_VOLTE); + //lv_obj_set_event_cb(btn, voip_local_remote_switch_action); + //lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_MID, 0, 0); + + // btn ring off + btn = lv_imgbtn_create(canvas, NULL); + lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN); + lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN); + lv_obj_set_event_cb(btn, mmi_vc_ring_off_action); + lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_VC_CALLING_RING_OFF_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET); + } + else if((ext->voiph263fmt == VOIP_H263_FMT_CIF) + || (ext->voiph263fmt == VOIP_H263_FMT_4CIF) + || (ext->voiph263fmt == VOIP_H263_FMT_16CIF) + || (ext->voiph263fmt == VOIP_H263_FMT_OTHER)) + { + /*Create the canvas object*/ + canvas = lv_canvas_create(content, NULL); + lv_obj_set_click(canvas, true); + lv_obj_set_event_cb(canvas, canvas_button_hidden_event_cb); + video_call_add_element(canvas); + ext->canvas = canvas; + + /*Assign the buffer to the canvas*/ + lv_img_set_src(canvas, ICON_BACKGROUND); + voip_signal_check_start(ext); + + // duration + label = lv_label_create(canvas, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_label_set_text(label, "00:00"); + lv_obj_set_click(label, false); + lv_obj_set_base_dir(label, LV_BIDI_DIR_LTR); + lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 0); + ext->phone_status_label = label; + ext->connect_time = label; + + // signal weak notification + label = lv_label_create(canvas, NULL); + lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26); + lv_label_set_text_id(label, WATCH_TEXT_ID_SIGNAL_WEAK); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_obj_align(label, canvas, LV_ALIGN_CENTER, 0, -10); + lv_obj_set_click(label, false); + lv_obj_set_hidden(label, true); + ext->signal_weak_label = label; + + // btn volume + btn = lv_imgbtn_create(canvas, NULL); + lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VOLUME_BTN); + lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VOLUME_BTN); + lv_obj_set_event_cb(btn, voip_volume_btn_action); + lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_LEFT, MMI_VC_CALLING_VOLUME_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET); + lv_obj_add_style(btn, LV_OBJ_PART_MAIN, &lv_watch_style_transp); + ext->volume_button = btn; + + // btn switch video + btn = lv_imgbtn_create(canvas, NULL); + //lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_SETTING_VOLTE); + //lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_SETTING_VOLTE); + //lv_obj_set_event_cb(btn, voip_local_remote_switch_action); + //lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_MID, 0, -20); + //lv_obj_add_style(btn, LV_OBJ_PART_MAIN, &lv_watch_style_transp); + ext->view_switch_button = btn; + + // btn ring off + btn = lv_imgbtn_create(canvas, NULL); + lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN); + lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN); + lv_obj_set_event_cb(btn, mmi_vc_ring_off_action); + lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_VC_CALLING_RING_OFF_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET); + lv_obj_add_style(btn, LV_OBJ_PART_MAIN, &lv_watch_style_transp); + ext->ring_off_button = btn; + + lv_obj_set_hidden(ext->connect_time, ext->canvas_button_hidden_flag); + lv_obj_set_hidden(ext->volume_button, ext->canvas_button_hidden_flag); + lv_obj_set_hidden(ext->view_switch_button, true); // lv_obj_set_hidden(ext->view_switch_button, ext->canvas_button_hidden_flag); + lv_obj_set_hidden(ext->ring_off_button, ext->canvas_button_hidden_flag); + } + + if(mmi_vc_call_get_obj()) { + lv_watch_obj_set_down_slide_cb(mmi_vc_call_get_obj(), voip_phone_down_slide_callback); + } + } +} + +static lv_obj_t * mmi_vc_ui_create(lv_obj_t * activity_obj) +{ + if(MMI_VC_UI_CONNECTED == s_vc_call_ui) + { + /* set speaker volume to nv when leaving activiry's slider */ + voip_set_volume_when_slider_act(); + } + + mmi_vc_call_screen_clean(); + + //lv_watch_png_cache_all_free(); + + if(activity_obj == NULL) + { + lv_watch_activity_ext_t activity_ext = {0}; + + activity_ext.actId = ACT_ID_VOIPPHONE; + activity_ext.create = NULL; // mmi_vc_ui_create; + activity_ext.prepare_destory = mmi_vc_ui_prepare_destory; + activity_obj = lv_watch_creat_activity_obj(&activity_ext); + if(NULL == activity_obj) + { + return NULL; + } + } + + lv_obj_t * obj = lv_watch_obj_create(activity_obj); + if(obj == NULL) + { + return NULL; + } + lv_watch_obj_set_anim_mode(obj, LV_WATCH_LEFT_OR_RIGHT_SLIDE_CALLBACK); + lv_watch_obj_set_left_slide_cb(obj, voip_phone_left_slide_callback); + lv_watch_obj_set_right_slide_cb(obj, voip_phone_right_slide_callback); + + lv_vc_call_obj_ext_t * ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_vc_call_obj_ext_t)); + if(ext == NULL) + { + return NULL; + } + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + ext->phone_status_label = NULL; + ext->phone_animation_obj = NULL; + ext->vc_ui = s_vc_call_ui; + ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_NULL; +#if ENABLE_VIDEO_SCALE == 0 + ext->voiph263fmt = VOIP_H263_FMT_QCIF; +#else + ext->voiph263fmt = VOIP_H263_FMT_OTHER; +#endif + + hal_rtc_t rtc_curr; // current rtc time + Hal_Rtc_Gettime(&rtc_curr); + ext->connect_start_time = time_to_seconds(&rtc_curr); + ext->connect_time = NULL; + ext->volume_button = NULL; + ext->view_switch_button = NULL; + ext->ring_off_button = NULL; + ext->canvas_button_hidden_flag = NOT_HIDDEN; + + /* content */ + lv_obj_t * content = lv_cont_create(obj, NULL); + lv_obj_set_size(content, lv_obj_get_width(obj), lv_obj_get_height(obj)); + //lv_cont_set_layout(content, LV_LAYOUT_COLUMN_MID); + lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_style_transp); + //lv_obj_set_style_local_bg_color(content, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); + lv_watch_obj_add_element(content); + lv_obj_set_click(content, false); + lv_obj_align(content, obj, LV_ALIGN_CENTER, 0, 0); + + switch(ext->vc_ui) + { + case MMI_VC_UI_DIALING: + mmi_vc_ui_dialing(content); + //mmi_vc_dialing_animation(ext->phone_status_label); + break; + + case MMI_VC_UI_CONNECTING: + mmi_vc_ui_connecting(content); + //mmi_vc_connecting_animation(ext->phone_status_label); + break; + + case MMI_VC_UI_CONNECTED: + mmi_vc_ui_connected(content); + mmi_vc_connected_animation(ext->phone_status_label); + break; + + default: + break; + } + + return obj; +} + +void mmi_ui_msg_update_vc_call_incoming(void) +{ + +} + +static void mmi_vc_call_connecting_timeout_cb(void * para) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED); +} + +void mmi_vc_call_action_connecting(void) +{ + if(MMI_VIDEO_CALL_STATE_CALLING == s_video_call_params.state + || MMI_VIDEO_CALL_STATE_CONNECTING == s_video_call_params.state + ) + { + return; + } + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + s_video_call_params.state = MMI_VIDEO_CALL_STATE_CONNECTING; + + // stop timer + mmi_vc_all_timer_stop(); + + // stop playing tone + Hal_Tone_Play_End(); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2); + + if(NULL == s_video_call_params.connecting_timer_id) + { + s_video_call_params.connecting_timer_id = Hal_Timer_Start(MMI_VC_CONNECTING_TIMEOUT, mmi_vc_call_connecting_timeout_cb, NULL, 0); + } + + s_vc_call_ui = MMI_VC_UI_CONNECTING; + mmi_vc_ui_create(NULL); +} + +void mmi_vc_call_action_connected(void) +{ + if(MMI_VIDEO_CALL_STATE_CALLING == s_video_call_params.state) + { + return; + } + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + s_video_call_params.state = MMI_VIDEO_CALL_STATE_CALLING; + + // stop timer + mmi_vc_all_timer_stop(); + + // stop playing tone + Hal_Tone_Play_End(); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2); + + Hal_Set_Voice_Call_Status(VOICE_CALL_START); + + s_vc_call_ui = MMI_VC_UI_CONNECTED; + mmi_vc_ui_create(NULL); +} + +static void mmi_vc_call_dialing_timeout_cb(void * para) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED); +} + +void mmi_vc_call_action_dialing_ext(char * t_appkey, char * t_secret, char * t_tokens, char * t_number, char * t_ticket) +{ + if(MMI_VIDEO_CALL_STATE_DIALING != s_video_call_params.state) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return; + } + + _lv_memset_00(s_hzch_vc_appkey, MMI_WATCH_VC_APPKEY_LEN); + strncpy(s_hzch_vc_appkey, t_appkey, MMI_WATCH_VC_APPKEY_LEN - 1); + + _lv_memset_00(s_hzch_vc_secret, MMI_WATCH_VC_SECRET_LEN); + strncpy(s_hzch_vc_secret, t_secret, MMI_WATCH_VC_SECRET_LEN - 1); + + _lv_memset_00(s_hzch_vc_tokens, MMI_WATCH_VC_TOKENS_LEN); + strncpy(s_hzch_vc_tokens, t_tokens, MMI_WATCH_VC_TOKENS_LEN - 1); + + _lv_memset_00(s_hzch_vc_number, MMI_WATCH_VC_NUMBER_LEN); + strncpy(s_hzch_vc_number, t_number, MMI_WATCH_VC_NUMBER_LEN - 1); + + _lv_memset_00(s_hzch_vc_ticket, MMI_WATCH_VC_TICKET_LEN); + strncpy(s_hzch_vc_ticket, t_ticket, MMI_WATCH_VC_TICKET_LEN - 1); + + char imei[16] = {0}; + app_adp_get_imei_req(imei); + _lv_memset_00(s_hzch_vc_uid, MMI_WATCH_VC_UID_LEN); + strncpy(s_hzch_vc_uid, imei, MMI_WATCH_VC_UID_LEN - 1); + + mmi_video_call_jrtc_config_init(s_hzch_vc_appkey, s_hzch_vc_secret, s_hzch_vc_tokens, s_hzch_vc_uid); + int8_t ret = mmi_video_call_dial_req(s_hzch_vc_number, s_vc_ticket); + if(0 > ret) + { + mmi_vc_call_dialing_timeout_cb(NULL); + } +} + +void mmi_vc_call_action_dialing(void) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + // stop timer + mmi_vc_all_timer_stop(); + + mmi_vc_call_params_clean(); + s_video_call_params.state = MMI_VIDEO_CALL_STATE_DIALING; + s_video_call_params.call_type = MODEM_VIDEO_CALL_TYPE_VIDEO; + + mmi_protocol_fzd_action_VC_CALL_DIAL(); + s_video_call_params.dialing_timer_id = Hal_Timer_Start(MMI_VC_DIALING_TIMEOUT, mmi_vc_call_dialing_timeout_cb, NULL, 0); + + voip_rat_check_start(); + + s_vc_call_ui = MMI_VC_UI_DIALING; + mmi_vc_ui_create(NULL); + + Hal_Audio_Manage_Start_Req(AUDIO_CTRL_PRIORITY_2, mmi_vc_audio_ctrl_callback); + Hal_Set_Voice_Call_Status(VOICE_CALL_START); +} + +static void * mmi_vc_main_ext_get(void) +{ + lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIP_PHONEBOOK); + if(NULL == activity_obj) + return NULL; + + lv_obj_t * watch_obj = NULL; + lv_watch_get_child_obj(activity_obj, lv_watch_obj_signal, &watch_obj); + if(NULL != watch_obj) + { + void * ext = lv_obj_get_ext_attr(watch_obj); + return ext; + } + + return NULL; +} + +static void mmi_vc_call_btn_event_cb(lv_obj_t * btn, lv_event_t e) +{ + if(LV_EVENT_CLICKED != e) + return; + + lv_hzch_vc_call_obj_ext_t * ext = (lv_hzch_vc_call_obj_ext_t *)mmi_vc_main_ext_get(); + if(NULL == ext) + return ; + + if(false == mmi_vc_check_mo_permission() + || true != mmi_watch_tcp_connect_state_get() + || true != mmi_protocol_watch_bind_state_get() + ) + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_obj_set_hidden(ext->img_call_cancel, true); + lv_obj_set_hidden(ext->button_call, true); + lv_obj_set_hidden(ext->button_cancel, true); + lv_obj_set_hidden(ext->img_no_signal, false); + } + else + { + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + mmi_vc_call_action_dialing(); + } +} + +static void mmi_vc_cancel_btn_event_cb(lv_obj_t * btn, lv_event_t e) +{ + if(LV_EVENT_CLICKED != e) + return; + + mmi_vc_main_prepare_destory(NULL); + lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIP_PHONEBOOK); + if(NULL != activity_obj) + { + lv_obj_del(activity_obj); + } +} + +static lv_obj_t * mmi_vc_main_create(lv_obj_t * activity_obj) +{ + if(activity_obj == NULL) + { + lv_watch_activity_ext_t activity_ext = {0}; + + activity_ext.actId = ACT_ID_VOIP_PHONEBOOK; + activity_ext.create = mmi_vc_main_create; + activity_ext.prepare_destory = mmi_vc_main_prepare_destory; + activity_obj = lv_watch_creat_activity_obj(&activity_ext); + if(NULL == activity_obj) + return NULL; + } + + lv_obj_t * obj = lv_watch_obj_create(activity_obj); + if(NULL == obj) + return NULL; + + /*Allocate the object type specific extended data*/ + lv_hzch_vc_call_obj_ext_t * ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_hzch_vc_call_obj_ext_t)); + /*ext realloc based on watch_obj_ext, do not memeset it*/ + if(NULL == ext) + return NULL; + + ext->img_call_cancel = NULL; + ext->button_call = NULL; + ext->button_cancel = NULL; + ext->img_no_signal = NULL; + + lv_obj_t * cont = lv_cont_create(obj, NULL); + lv_cont_set_fit(cont, LV_FIT_NONE); + lv_obj_set_size(cont, LV_HOR_RES, LV_VER_RES); // lv_obj_get_width(obj), lv_obj_get_height(obj)); + lv_obj_set_style_local_bg_color(cont, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); + lv_cont_set_layout(cont, LV_LAYOUT_OFF); + lv_obj_set_click(cont, false); + + lv_obj_t * obj_temp = NULL; + // no signal + obj_temp = lv_img_create(cont, NULL); + lv_img_set_src(obj_temp, ICON_VIDEO_CALL_NO_SIGNAL); + lv_obj_align(obj_temp, NULL, LV_ALIGN_CENTER, 0, 0); + lv_obj_set_click(obj_temp, false); + ext->img_no_signal = obj_temp; + lv_obj_set_hidden(ext->img_no_signal, true); + + // default + obj_temp = lv_img_create(cont, NULL); + lv_img_set_src(obj_temp, ICON_VIDEO_CALL_DEFAULT); + lv_obj_align(obj_temp, NULL, LV_ALIGN_CENTER, 0, 0); + lv_obj_set_click(obj_temp, false); + ext->img_default = obj_temp; + + obj_temp = lv_btn_create(ext->img_default, NULL); + lv_obj_set_size(obj_temp, LV_HOR_RES, LV_VER_RES / 2); + //lv_obj_set_style_local_bg_color(btn_cancel, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_MAKE(0x47, 0xA6, 0xFF)); + //lv_obj_set_style_local_radius(btn_cancel, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 30); + //lv_obj_set_style_local_bg_color(btn_cancel, LV_BTN_PART_MAIN, LV_STATE_PRESSED, LV_COLOR_MAKE(0x47, 0xA6, 0xFF)); + //lv_obj_set_style_local_radius(btn_cancel, LV_BTN_PART_MAIN, LV_STATE_PRESSED, 30); + lv_obj_add_style(obj_temp, LV_BTN_PART_MAIN, &lv_style_transp_fit); + lv_obj_align(obj_temp, NULL, LV_ALIGN_IN_TOP_MID, 0, 0); + lv_obj_set_event_cb(obj_temp, mmi_vc_call_btn_event_cb); + ext->button_call = obj_temp; + + obj_temp = lv_btn_create(ext->img_default, NULL); + lv_obj_set_size(obj_temp, LV_HOR_RES, LV_VER_RES / 2); + lv_obj_add_style(obj_temp, LV_BTN_PART_MAIN, &lv_style_transp_fit); + lv_obj_align(obj_temp, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0); + lv_obj_set_event_cb(obj_temp, mmi_vc_cancel_btn_event_cb); + ext->button_cancel = obj_temp; + lv_obj_set_hidden(ext->img_default, false); + lv_obj_set_hidden(ext->button_call, false); + lv_obj_set_hidden(ext->button_cancel, false); + + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + return obj; +} + +void mmi_video_call_create_event_cb(lv_obj_t * btn, lv_event_t e) +{ +#ifdef __VIDEO_CALL_TEST__ + nv_watch_vc_contact_t t_test_contact = + { + 3, + {"test001", "test002", "test003"}, + {"jrtc001", "jrtc002", "jrtc003"} + }; + + _lv_memcpy(&s_vc_contact, &t_test_contact, sizeof(nv_watch_vc_contact_t)); +#endif + + if(LV_EVENT_CLICKED == e) + { + lv_watch_png_cache_all_free(); + mmi_vc_main_create(NULL); + } + else if(LV_EVENT_LONG_PRESSED == e) + { + + } +} +#endif + + +//interface +uint8_t mmi_vc_get_call_volume(void) +{ + return(s_video_call_params.speaker_volume); +} + +bool mmi_vc_watch_suspend_check(void) +{ + if((s_video_call_params.call_type == MODEM_VIDEO_CALL_TYPE_VIDEO) + || (MMI_VIDEO_CALL_STATE_INCOMING == s_video_call_params.state) + || (MMI_VIDEO_CALL_STATE_DIALING == s_video_call_params.state) + || (MMI_VIDEO_CALL_STATE_CONNECTING == s_video_call_params.state) + ) + { + return false; + } + + return true; +} + +bool mmi_vc_connect_check_req(void) +{ + if(mmi_vc_call_get_activity_obj()) + { + return true; + } + + return false; +} + +void mmi_vc_activity_destroy_req(void) +{ + VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_obj_t * activity_obj = mmi_vc_call_get_activity_obj(); + if(NULL == activity_obj) + { + return; + } + + // stop playing tone + Hal_Tone_Play_End(); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2); + + // stop timer + mmi_vc_all_timer_stop(); + + // + voip_signal_check_stop(); + voip_rat_check_stop(); + + switch(s_video_call_params.state) + { + case MMI_VIDEO_CALL_STATE_NONE: + case MMI_VIDEO_CALL_STATE_INVALID: + // do noting + break; + + case MMI_VIDEO_CALL_STATE_INCOMING: + break; + + default: + mmi_video_call_hangup_req(FALSE); + break; + } + + mmi_vc_call_params_clean(); + voip_set_volume_when_slider_act(); + mmi_vc_call_screen_clean(); + lv_watch_png_cache_all_free(); +} + +#endif + + diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_hzch.h b/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_hzch.h new file mode 100644 index 00000000..a2f3658b --- /dev/null +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/mmi_video_call/mmi_video_call_hzch.h @@ -0,0 +1,101 @@ + + + +#ifndef __MMI_VIDEO_CALL_FZD_H__ +#define __MMI_VIDEO_CALL_FZD_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#ifdef LV_CONF_INCLUDE_SIMPLE +#include "lvgl.h" +#include "lv_ex_conf.h" +#else +#include "../../../lvgl/lvgl.h" +#include "../../../lv_ex_conf.h" +#endif + + +#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__ + +#if 1 + +lv_vc_call_obj_ext_t * mmi_vc_call_get_ext(void); + +bool check_voipcall_enter_pm_ind(void); +void watch_voip_message_handle_init(void); + + +void mmi_video_call_jrtc_config_init_00(void); +void mmi_video_call_jrtc_config_init_01(char * t_tokens); +void mmi_video_call_contact_nv_read(void); +void mmi_vc_contact_set(nv_watch_vc_contact_t * contact_list); + +void * mmi_video_call_phone_get_video_buffer(void); +void mmi_vc_call_action_dialing(char * number, MODEM_VIDEO_CALL_TYPE type); +void mmi_vc_call_action_incoming(char * number, MODEM_VIDEO_CALL_TYPE type, char * t_ticket, char * t_tokens); +void mmi_vc_call_action_connecting(void); +void mmi_vc_call_action_connected(void); + +void mmi_ui_msg_update_vc_call_stop(void); +void mmi_vc_call_action_call_stop(void); +void mmi_ui_msg_update_vc_call_incoming(void); +bool mmi_vc_call_action_incoming_no_permission(void); + +int8_t mmi_video_call_dial_req(MODEM_VIDEO_CALL_TYPE calltype, char * pContactUri, char * t_ticket); +void mmi_video_call_hangup_req(BOOL bye); +int8_t mmi_video_call_answer_req(char * t_ticket); +void mmi_video_call_reject_req(BOOL bye); +void voip_fps_check(int8_t fps); + + +#else +typedef struct +{ + lv_watch_obj_ext_t lv_watch_obj; + + /*New data for this type */ + lv_obj_t * img_call_cancel; + lv_obj_t * button_call; + lv_obj_t * button_cancel; + lv_obj_t * img_no_signal; +}lv_hzch_vc_call_obj_ext_t; + + + +lv_vc_call_obj_ext_t * mmi_vc_call_get_ext(void); + +bool check_voipcall_enter_pm_ind(void); +void watch_voip_message_handle_init(void); + + +void mmi_video_call_jrtc_config_init_00(void); +void mmi_video_call_jrtc_config_init(char * t_tokens); +void mmi_video_call_contact_nv_read(void); + +void * mmi_video_call_phone_get_video_buffer(void); +void mmi_vc_call_action_dialing(char * number, MODEM_VIDEO_CALL_TYPE type); +void mmi_vc_call_action_connecting(void); +void mmi_vc_call_action_connected(void); + +void mmi_ui_msg_update_vc_call_stop(void); +void mmi_vc_call_action_call_stop(void); +void mmi_ui_msg_update_vc_call_incoming(void); + +int8_t mmi_video_call_dial_req(char * t_number, char * t_ticket); +void mmi_video_call_hangup_req(BOOL bye); +void voip_fps_check(int8_t fps); +#endif + +#endif + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*VIDEOCALL_H*/ diff --git a/2.sdk/sdk/gui/lv_watch/mmi_protocol/mmi_protocol_fzd.c b/2.sdk/sdk/gui/lv_watch/mmi_protocol/mmi_protocol_fzd.c index 03b5da6e..8f8a3cd2 100644 --- a/2.sdk/sdk/gui/lv_watch/mmi_protocol/mmi_protocol_fzd.c +++ b/2.sdk/sdk/gui/lv_watch/mmi_protocol/mmi_protocol_fzd.c @@ -535,7 +535,7 @@ void mmi_protocol_fzd_receive_data_process(char * recv_str, int recv_len) static bool mmi_protocol_fzd_send_without_data(MMI_PROTOCOL_FZD_ACTION_ENUM action) { bool result = false; - unsigned char content_buff = NULL; + unsigned char * content_buff = NULL; unsigned int content_lenth = 0; result = mmi_protocol_fzd_send_content_construct(action, content_buff, content_lenth); @@ -582,6 +582,10 @@ bool mmi_protocol_fzd_parse_LINK(unsigned char * next_buff, unsigned int next_bu mmi_protocol_fzd_action_get_app_qrcode(); +#ifdef MMI_PROJECT_C55_DS_D11G_DT_HZCH + mmi_protocol_fzd_action_send_telecom_info_pre(); +#endif + return true; } @@ -681,7 +685,9 @@ bool mmi_protocol_fzd_parse_ACTION_BIND(unsigned char * next_buff, unsigned int //video call #ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__ + #if 1 // ndef __MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__ mmi_protocol_fzd_action_get_vc_config(); + #endif #endif // hengai @@ -2412,7 +2418,7 @@ bool mmi_protocol_fzd_action_VC_CALL_RESPONSE(char * number, uint8_t state) } #endif -#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__ +#if defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__) bool mmi_protocol_fzd_action_get_vc_config(void) { return mmi_protocol_fzd_send_without_data(MMI_FZD_WATCH_GET_VC_CONFIG); @@ -2956,6 +2962,115 @@ bool mmi_protocol_fzd_action_VC_CALL_RESPONSE(char * number, char * ticket, MODE } #endif +#if 0 // def __MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__ +bool mmi_protocol_fzd_action_VC_CALL_DIAL(void); +{ + return mmi_protocol_fzd_send_without_data(MMI_FZD_ACTION_VC_CALL_DIAL); +} + +// [XX*YY*LEN*VC_DIAL,state,appKey,secret,tokens,number,ticket] +bool mmi_protocol_fzd_parse_VC_CALL_DIAL(unsigned char * next_buff, unsigned int next_buff_len) +{ + bool result = false; + + if(NULL == next_buff || 0 == next_buff_len) + { + PROTOCOL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return false; + } + + result = true; + + char * t_value = NULL; + t_value = km_strtok_r(NULL, ",", &next_buff); + PROTOCOL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: t_value=%s\n", __FUNCTION__, __LINE__, t_value); + if(0 == atoi(t_value)) + { + // stop + //mmi_vc_call_action_call_stop(); + } + else + { + // go on + char * t_appkey = NULL; + char * t_secret = NULL; + char * t_tokens = NULL; + char * t_number = NULL; + char * t_ticket = NULL; + + t_appkey = km_strtok_r(NULL, ",", &next_buff); + t_secret = km_strtok_r(NULL, ",", &next_buff); + t_tokens = km_strtok_r(NULL, ",", &next_buff); + t_number = km_strtok_r(NULL, ",", &next_buff); + t_ticket = next_buff; + + mmi_vc_call_action_dialing_ext(t_appkey, t_secret, t_tokens, t_number, t_ticket); + } + + return result; +} + +// [XX*YY*LEN*VC_CANCEL,number,ticket] +bool mmi_protocol_fzd_action_VC_CALL_CANCEL(char * t_number, char * t_ticket); +{ + bool result = false; + MMI_PROTOCOL_FZD_ACTION_ENUM action = MMI_FZD_ACTION_VC_CALL_CANCEL; + unsigned char content_buff[MMI_WATCH_VC_NUMBER_LEN + MMI_WATCH_VC_TICKET_LEN] = {0}; + unsigned int content_lenth = 0; + + sprintf(content_buff, ",%s,%d", t_number, t_ticket); + content_lenth = strlen(content_buff); + + result = mmi_protocol_fzd_send_with_data(action, content_buff, content_lenth); + + return result; +} + +// [XX*YY*LEN*VC_REFERRAL] +bool mmi_protocol_fzd_parse_SERVER_VC_CALL_REFERRAL(unsigned char * next_buff, unsigned int next_buff_len) +{ + bool result = false; + MMI_PROTOCOL_FZD_ACTION_ENUM action = MMI_FZD_SERVER_VC_CALL_REFERRAL; + + result = true; + mmi_protocol_fzd_send_without_data(action); + + mmi_vc_call_action_call_referral(); + + return result; +} + +// [XX*YY*LEN*VC_RECOVER] +bool mmi_protocol_fzd_parse_SERVER_VC_CALL_RECOVER(unsigned char * next_buff, unsigned int next_buff_len) +{ + bool result = false; + MMI_PROTOCOL_FZD_ACTION_ENUM action = MMI_FZD_SERVER_VC_CALL_RECOVER; + + result = true; + mmi_protocol_fzd_send_without_data(action); + + // the other party is reject + //mmi_vc_call_action_call_stop(); + + return result; +} + +// [XX*YY*LEN*VC_OFF] +bool mmi_protocol_fzd_parse_SERVER_VC_CALL_CANCEL(unsigned char * next_buff, unsigned int next_buff_len) +{ + bool result = false; + MMI_PROTOCOL_FZD_ACTION_ENUM action = MMI_FZD_SERVER_VC_CALL_CANCEL; + + result = true; + mmi_protocol_fzd_send_without_data(action); + + // the other party is reject + //mmi_vc_call_action_call_stop(); + + return result; +} +#endif + #endif #ifdef __MMI_ZHSX_SUPPORT_DO_NOT_DISTURB__ @@ -3857,32 +3972,106 @@ bool mmi_protocol_fzd_action_hengai_sleep_data_test(char * file_buf, uint32_t fi #endif -#ifdef __MMI_CUSTOM_HENGAI_TCMS__ -bool mmi_protocol_fzd_action_hengai_tcms_data(char * file_buf, uint32_t file_size) +#ifdef MMI_PROJECT_C55_DS_D11G_DT_HZCH + +#define MMI_CHECK_CELL_ID_INTERVAL (1000 * 1) // ms + +static uint32_t s_protocol_cell_id = 0; +static void * s_protocol_cell_id_timer_id = NULL; + +static void mmi_protocol_check_cell_id_timer_cb(uint32_t para); + +static void mmi_protocol_lte_cell_info_ind(app_adp_lte_cells_t * cell_list) { - bool result = false; - MMI_PROTOCOL_FZD_ACTION_ENUM action = MMI_FZD_ACTION_HENGAI_TCMS_DATA; - unsigned char * content_buff = NULL; - unsigned int content_lenth = 0; + s_protocol_cell_id = cell_list->scell.cellid; + PROTOCOL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: cell_id=%d\n", __FUNCTION__, __LINE__, s_protocol_cell_id); +} -#if 0 - content_buff = (unsigned char *)lv_mem_alloc(file_size + 2); - if(NULL == content_buff) +static void mmi_protocol_gsm_cell_info_ind(app_adp_gsm_cells_t * cell_list) +{ + s_protocol_cell_id = cell_list->scell.cell_id; + PROTOCOL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: cell_id=%d\n", __FUNCTION__, __LINE__, s_protocol_cell_id); +} + +static void mmi_protocol_check_cell_id_timer_cb(uint32_t para) +{ + PROTOCOL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: cell_id=%d\n", __FUNCTION__, __LINE__, s_protocol_cell_id); + + if(0 == s_protocol_cell_id) { - PROTOCOL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); - return false; + uos_timer_stop(s_protocol_cell_id_timer_id); + uos_timer_start(s_protocol_cell_id_timer_id, MS_TO_TICKS(MMI_CHECK_CELL_ID_INTERVAL), 0, mmi_protocol_check_cell_id_timer_cb, NULL); } - _lv_memset_00(content_buff, file_size + 2); - sprintf(content_buff, ","); - _lv_memcpy(content_buff + 1, file_buf, file_size); - content_lenth = file_size; + else + { + if(NULL != s_protocol_cell_id_timer_id) + { + uos_timer_stop(s_protocol_cell_id_timer_id); + uos_timer_delete(s_protocol_cell_id_timer_id); + s_protocol_cell_id_timer_id = NULL; + } + + mmi_protocol_fzd_action_send_telecom_info(); + } +} + +bool mmi_protocol_fzd_action_send_telecom_info_pre(void) +{ + app_adaptor_lte_cell_info_ind_bind(mmi_protocol_lte_cell_info_ind); + app_adaptor_gsm_cell_info_ind_bind(mmi_protocol_gsm_cell_info_ind); + app_adaptor_get_cell_info_req(GET_CELL_INFO_ONCE_MODE); + + if(NULL != s_protocol_cell_id_timer_id) + uos_timer_stop(s_protocol_cell_id_timer_id); + else + uos_timer_create(&s_protocol_cell_id_timer_id); + + uos_timer_start(s_protocol_cell_id_timer_id, MS_TO_TICKS(MMI_CHECK_CELL_ID_INTERVAL), 0, mmi_protocol_check_cell_id_timer_cb, NULL); +} + +bool mmi_protocol_fzd_action_send_telecom_info(void) +{ + bool result = false; + MMI_PROTOCOL_FZD_ACTION_ENUM action = MMI_FZD_ACTION_SEND_TELECOM_INFO; + unsigned char content_buff[512] = {0}; + unsigned int content_lenth = 0; + + // imei + char imei[16 + 1] = {0}; + app_adp_get_imei_req(imei); + strcat(content_buff, ",IMEI:"); + strcat(content_buff, imei); + + // iccid + char * p_iccid = app_adaptor_get_iccid_info_req(); + strcat(content_buff, ",ICCID:"); + strcat(content_buff, p_iccid); + lv_mem_free(p_iccid); + + // imsi + char imsi[16] = {0}; + app_adp_get_imsi_req(imsi); + strcat(content_buff, ",IMSI:"); + strcat(content_buff, imsi); + + // cellid + char cell_id_str[64] = {0}; + sprintf(cell_id_str, "%d", s_protocol_cell_id); + strcat(content_buff, ",CELLID:"); + strcat(content_buff, cell_id_str); + + // version + char version_str[64] = {0}; + sprintf(version_str, "%s_V1.0_Release", app_adaptor_get_model_id()); + strcat(content_buff, ",VERSION:"); + strcat(content_buff, version_str); + content_lenth = strlen(content_buff); result = mmi_protocol_fzd_send_with_data(action, content_buff, content_lenth); - lv_mem_free(content_buff); -#endif return result; } + #endif #endif diff --git a/2.sdk/sdk/gui/lv_watch/mmi_protocol/mmi_protocol_fzd.h b/2.sdk/sdk/gui/lv_watch/mmi_protocol/mmi_protocol_fzd.h index 52025c4a..054cae2d 100644 --- a/2.sdk/sdk/gui/lv_watch/mmi_protocol/mmi_protocol_fzd.h +++ b/2.sdk/sdk/gui/lv_watch/mmi_protocol/mmi_protocol_fzd.h @@ -144,7 +144,8 @@ typedef enum MMI_FZD_ACTION_GET_APP_QRCODE, #ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__ -#if defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_WULIAN__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_TONGXIN__) +#if defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_WULIAN__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_TONGXIN__) \ + || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__) MMI_FZD_WATCH_GET_VC_CONFIG, MMI_FZD_WATCH_GET_VC_CONTACT, MMI_FZD_WATCH_VC_CALL_REQUEST, @@ -152,6 +153,13 @@ typedef enum MMI_FZD_SERVER_VC_CALL_REQUEST, MMI_FZD_WATCH_VC_CALL_RESPONSE, #endif +#if 0 // def __MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__ + MMI_FZD_ACTION_VC_CALL_DIAL, + MMI_FZD_ACTION_VC_CALL_CANCEL, + MMI_FZD_SERVER_VC_CALL_REFERRAL, + MMI_FZD_SERVER_VC_CALL_RECOVER, + MMI_FZD_SERVER_VC_CALL_CANCEL, +#endif #endif #ifdef __MMI_ZHSX_SUPPORT_DO_NOT_DISTURB__ @@ -200,6 +208,9 @@ MMI_FZD_SERVER_SET_GSENSOR_UPLOAD_SWITCH, MMI_FZD_SERVER_SET_GSENSOR_DATA, MMI_FZD_ACTION_HENGAI_SLEEP_DATA_TEST, #endif +#endif +#ifdef MMI_PROJECT_C55_DS_D11G_DT_HZCH + MMI_FZD_ACTION_SEND_TELECOM_INFO, #endif MMI_FZD_SERVER_SET_BOOTOFF, MMI_FZD_SEND_UP_REMIND, @@ -316,9 +327,20 @@ bool mmi_protocol_fzd_action_get_app_qrcode(void); bool mmi_protocol_fzd_parse_ACTION_GET_APP_QRCODE(unsigned char * next_buff, unsigned int next_buff_len); #ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__ +#if defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_WULIAN__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_TONGXIN__) \ + || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__) bool mmi_protocol_fzd_action_get_vc_config(void); bool mmi_protocol_fzd_action_VC_CALL_REQUEST(char * number, uint8_t call_type); #endif +#if 0 // def __MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__ +bool mmi_protocol_fzd_action_VC_CALL_DIAL(void); +bool mmi_protocol_fzd_parse_VC_CALL_DIAL(unsigned char * next_buff, unsigned int next_buff_len); +bool mmi_protocol_fzd_action_VC_CALL_CANCEL(char * t_number, char * t_ticket); +bool mmi_protocol_fzd_parse_SERVER_VC_CALL_REFERRAL(unsigned char * next_buff, unsigned int next_buff_len); +bool mmi_protocol_fzd_parse_SERVER_VC_CALL_RECOVER(unsigned char * next_buff, unsigned int next_buff_len); +bool mmi_protocol_fzd_parse_SERVER_VC_CALL_CANCEL(unsigned char * next_buff, unsigned int next_buff_len); +#endif +#endif #ifdef __MMI_ZHSX_SUPPORT_DO_NOT_DISTURB__ bool mmi_protocol_fzd_parse_SERVER_SET_NOT_DISTURB(unsigned char * next_buff, unsigned int next_buff_len); @@ -360,8 +382,10 @@ bool mmi_protocol_fzd_parse_ACTION_HENGAI_ACTIVATION(unsigned char * next_buff, bool mmi_protocol_fzd_action_hengai_activation_feedback(void); bool mmi_protocol_fzd_action_hengai_sleep_data(char * file_buf, uint32_t file_size); #endif - - +#ifdef MMI_PROJECT_C55_DS_D11G_DT_HZCH +bool mmi_protocol_fzd_action_send_telecom_info(void); +bool mmi_protocol_fzd_action_send_telecom_info_pre(void); +#endif #endif diff --git a/2.sdk/sdk/gui/lv_watch/mmi_protocol/mmi_protocol_fzd_content.c b/2.sdk/sdk/gui/lv_watch/mmi_protocol/mmi_protocol_fzd_content.c index 16fce3a5..365f65ce 100644 --- a/2.sdk/sdk/gui/lv_watch/mmi_protocol/mmi_protocol_fzd_content.c +++ b/2.sdk/sdk/gui/lv_watch/mmi_protocol/mmi_protocol_fzd_content.c @@ -77,7 +77,7 @@ static unsigned char * mmi_protocol_fzd_action_string_get(MMI_PROTOCOL_FZD_ACTIO {MMI_FZD_SERVER_VC_CALL_REQUEST, "jup_hoo_request"}, {MMI_FZD_WATCH_VC_CALL_RESPONSE, "jup_hoo_response"}, #endif - #if defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_TONGXIN__) + #if defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_TONGXIN__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__) {MMI_FZD_WATCH_GET_VC_CONFIG, "JPREG"}, {MMI_FZD_WATCH_GET_VC_CONTACT, "MEMBERS"}, {MMI_FZD_WATCH_VC_CALL_REQUEST, "AGTALK"}, @@ -85,6 +85,13 @@ static unsigned char * mmi_protocol_fzd_action_string_get(MMI_PROTOCOL_FZD_ACTIO {MMI_FZD_SERVER_VC_CALL_REQUEST, "CALLING"}, {MMI_FZD_WATCH_VC_CALL_RESPONSE, "RCALLING"}, #endif + #if 0 // def __MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__ + {MMI_FZD_ACTION_VC_CALL_DIAL, "VC_DIAL"}, + {MMI_FZD_ACTION_VC_CALL_CANCEL, "VC_CANCEL"}, + {MMI_FZD_SERVER_VC_CALL_REFERRAL, "VC_REFERRAL"}, + {MMI_FZD_SERVER_VC_CALL_RECOVER, "VC_RECOVER"}, + {MMI_FZD_SERVER_VC_CALL_CANCEL, "VC_OFF"}, + #endif #endif #ifdef __MMI_ZHSX_SUPPORT_DO_NOT_DISTURB__ {MMI_FZD_SERVER_SET_NOT_DISTURB, "SILENCETIME2"}, @@ -134,8 +141,8 @@ static unsigned char * mmi_protocol_fzd_action_string_get(MMI_PROTOCOL_FZD_ACTIO {MMI_FZD_ACTION_HENGAI_SLEEP_DATA_TEST, "TEST_SLEEP_DATA"}, #endif #endif - #ifdef __MMI_CUSTOM_HENGAI_TCMS__ - {MMI_FZD_ACTION_HENGAI_TCMS_DATA, "CNDOCD"}, + #ifdef MMI_PROJECT_C55_DS_D11G_DT_HZCH + {MMI_FZD_ACTION_SEND_TELECOM_INFO, "TELECOM_INFO"}, #endif {MMI_FZD_SERVER_SET_BOOTOFF, "BOOTOFF"}, {MMI_FZD_SEND_UP_REMIND, "UP_REMIND"}, @@ -331,7 +338,8 @@ static bool mmi_protocol_fzd_content_parse(unsigned char * content_ptr, unsigned break; #ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__ - #if defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_WULIAN__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_TONGXIN__) + #if defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_WULIAN__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__) || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_TONGXIN__) \ + || defined(__MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__) case MMI_FZD_WATCH_GET_VC_CONFIG: mmi_protocol_fzd_parse_WATCH_GET_VC_CONFIG(next_buff, next_buff_len); break; @@ -355,6 +363,26 @@ static bool mmi_protocol_fzd_content_parse(unsigned char * content_ptr, unsigned case MMI_FZD_WATCH_VC_CALL_RESPONSE: break; #endif + #if 0 // def __MMI_ZHSX_SUPPORT_VIDEO_CALL_HZCH__ + case MMI_FZD_ACTION_VC_CALL_DIAL: + mmi_protocol_fzd_parse_VC_CALL_DIAL(next_buff, next_buff_len); + break; + + case MMI_FZD_ACTION_VC_CALL_CANCEL: + break; + + case MMI_FZD_SERVER_VC_CALL_REFERRAL: + mmi_protocol_fzd_parse_SERVER_VC_CALL_REFERRAL(next_buff, next_buff_len); + break; + + case MMI_FZD_SERVER_VC_CALL_RECOVER: + mmi_protocol_fzd_parse_SERVER_VC_CALL_RECOVER(next_buff, next_buff_len); + break; + + case MMI_FZD_SERVER_VC_CALL_CANCEL: + mmi_protocol_fzd_parse_SERVER_VC_CALL_CANCEL(next_buff, next_buff_len); + break; + #endif #endif #ifdef __MMI_ZHSX_SUPPORT_DO_NOT_DISTURB__ @@ -465,8 +493,8 @@ static bool mmi_protocol_fzd_content_parse(unsigned char * content_ptr, unsigned #endif #endif - #ifdef __MMI_CUSTOM_HENGAI_TCMS__ - case MMI_FZD_ACTION_HENGAI_TCMS_DATA: + #ifdef MMI_PROJECT_C55_DS_D11G_DT_HZCH + case MMI_FZD_ACTION_SEND_TELECOM_INFO: break; #endif