--- /dev/null
+
+
+
+#include "lv_watch.h"
+
+
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL__
+#ifdef __MMI_ZHSX_SUPPORT_VIDEO_CALL_FZD__
+
+#include "mmi_video_call_fzd.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+
+//static lv_signal_cb_t ancestor_signal;
+#if VIDEO_SIGNAL_CHECK
+static lv_task_t * signal_check_task = NULL;
+#endif
+static lv_task_t * rat_check_task = NULL;
+
+static MMI_VIDEO_CALL_PARAMS_T s_video_call_params = {0};
+lv_color_t g_cbuf[canvas_width * canvas_heigh + 8] __attribute__((aligned(8)));
+
+static char s_video_call_ticket[MMI_WATCH_VC_TICKET_LEN] = {0};
+static char s_video_call_tokens[MMI_WATCH_VC_TOKENS_LEN] = {0};
+
+
+/**********************
+* STATIC PROTOTYPES
+**********************/
+static lv_obj_t * voip_ring_off_content_create(lv_obj_t * par);
+static void voip_phone_left_slide_callback(lv_obj_t * obj);
+static void voip_phone_right_slide_callback(lv_obj_t * obj);
+static void voip_phone_down_slide_callback(lv_obj_t * obj);
+static void voip_volume_btn_action(lv_obj_t * obj, lv_event_t e);
+static void voip_slider_action(lv_obj_t * slider, lv_event_t e);
+static void voip_phone_obj_hide_anim_end(lv_anim_t * anim);
+static void voip_anim_fp_dialing_ring(lv_obj_t * obj, int32_t x);
+static void voip_get_time_elaps(uint32_t last_time, char * str, int8_t size);
+static void voip_set_volume_when_slider_act(void);
+static void voip_local_remote_switch_action(lv_obj_t * btn, lv_event_t e);
+static void canvas_button_hidden_event_cb(lv_obj_t * obj, lv_event_t e);
+static void voip_signal_check_start(void * ext);
+static void voip_signal_check_stop(void);
+static bool is_rat_gsm(void);
+static void voip_rat_check_start(void);
+static void voip_rat_check_stop(void);
+
+
+void mmi_vc_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority)
+{
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, priority);
+
+ if(AUDIO_CTRL_PRIORITY_2 > priority)
+ {
+ lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE);
+ if(activity_obj == NULL)
+ {
+ return;
+ }
+ mmi_vc_activity_destroy_req_fzd();
+ Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
+ }
+}
+
+void * mmi_video_call_phone_get_video_buffer()
+{
+ return g_cbuf;
+}
+
+/**********************
+* STATIC FUNCTIONS
+**********************/
+static lv_obj_t * mmi_vc_call_get_activity_obj(void)
+{
+ lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE);
+
+ return(activity_obj);
+}
+
+static lv_obj_t * mmi_vc_call_get_obj(void)
+{
+ lv_obj_t * watch_obj = NULL;
+
+ lv_obj_t * activity_obj = mmi_vc_call_get_activity_obj();
+
+ if(activity_obj)
+ {
+ lv_watch_get_child_obj(activity_obj, lv_watch_obj_signal, &watch_obj);
+ }
+
+ return(watch_obj);
+}
+
+lv_vc_call_obj_ext_t * mmi_vc_call_get_ext(void)
+{
+ lv_vc_call_obj_ext_t * ext = NULL;
+ lv_obj_t * watch_obj = mmi_vc_call_get_obj();
+
+ if(watch_obj)
+ {
+ ext = lv_obj_get_ext_attr(watch_obj);
+ }
+
+ return(ext);
+}
+
+static void mmi_vc_call_screen_clean(void)
+{
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_obj_t * slider_activit_obj = lv_watch_get_activity_obj(ACT_ID_SLIDER);
+
+ if(slider_activit_obj)
+ {
+ lv_obj_del(slider_activit_obj);
+ }
+
+ lv_obj_t * activity_obj = mmi_vc_call_get_activity_obj();
+ if(activity_obj)
+ {
+ lv_obj_del(activity_obj);
+ }
+}
+
+static void voip_phone_left_slide_callback(lv_obj_t * obj)
+{
+ printf("%s %d\n", __FUNCTION__, __LINE__);
+ if((MMI_VIDEO_CALL_STATE_CALLING == s_video_call_params.state)
+ && (MODEM_VIDEO_CALL_TYPE_VIDEO == s_video_call_params.call_type)) {
+ voip_local_remote_switch_action(NULL, LV_EVENT_CLICKED);
+ }
+}
+
+static void voip_phone_right_slide_callback(lv_obj_t * obj)
+{
+ printf("%s %d\n", __FUNCTION__, __LINE__);
+ mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);
+}
+
+static void voip_phone_down_slide_callback(lv_obj_t * obj)
+{
+ printf("%s %d\n", __FUNCTION__, __LINE__);
+ voip_volume_btn_action(NULL, LV_EVENT_CLICKED);
+}
+
+static void voip_slider_action(lv_obj_t * slider, lv_event_t e)
+{
+ if(e == LV_EVENT_VALUE_CHANGED)
+ {
+ printf("%s %d\n", __FUNCTION__, __LINE__);
+
+ uint8_t v = lv_slider_get_value(slider);
+
+ // set speaker volume
+ if(!Hal_Set_BT_Audio_Path((HAL_SPEAKER_GAIN)v))
+ Hal_Call_Speaker(HAL_CALL_SPK_ON, (HAL_SPEAKER_GAIN)v);
+ s_video_call_params.speaker_volume = v;
+ }
+}
+
+static void voip_volume_btn_action(lv_obj_t * obj, lv_event_t e)
+{
+ if(LV_EVENT_CLICKED != e) {
+ return;
+ }
+
+ printf("%s %d\n", __FUNCTION__, __LINE__);
+ slider_create(NULL, SETTING_VOIP_SPEAKER, 40, voip_slider_action);
+}
+
+static void voip_phone_obj_hide_anim_end(lv_anim_t * anim)
+{
+ (void)anim;
+ printf("%s %d\n", __FUNCTION__, __LINE__);
+
+ mmi_vc_call_screen_clean();
+}
+
+static lv_obj_t * voip_ring_off_content_create(lv_obj_t * par)
+{
+ printf("%s %d\n", __FUNCTION__, __LINE__);
+ if(par == NULL) {
+ par = lv_scr_act();
+ }
+
+ lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+ LV_ASSERT_MEM(ext);
+ if(ext == NULL) {
+ return(NULL);
+ }
+
+ lv_obj_t * obj = lv_obj_create(par, NULL);
+ LV_ASSERT_MEM(obj);
+ if(obj == NULL) {
+ return(NULL);
+ }
+ lv_obj_set_size(obj, lv_obj_get_width(par), lv_obj_get_height(par));
+ lv_obj_add_style(obj, LV_OBJ_PART_MAIN, &lv_style_transp_tight);
+
+ lv_obj_t * content = lv_cont_create(obj, NULL);
+ LV_ASSERT_MEM(content);
+ if(content == NULL) {
+ return(NULL);
+ }
+
+ lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_cont_opa1);
+ lv_obj_set_size(content, 204, 44);
+ if(ext->vc_ui == MMI_VC_UI_INCOMING || ext->vc_ui == MMI_VC_UI_DIALING) {
+ lv_obj_align(content, obj, LV_ALIGN_IN_TOP_MID, 0, 10);
+ } else {
+ lv_obj_align(content, obj, LV_ALIGN_CENTER, 0, -12);
+ }
+ lv_cont_set_layout(content, LV_LAYOUT_CENTER);
+ lv_obj_set_click(content, false);
+
+ lv_obj_t * label = lv_label_create(content, NULL);
+ lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20);
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+
+ if(is_rat_gsm())
+ {
+ lv_label_set_text_id(label, WATCH_TEXT_ID_NETWORK_WRONG);
+ }
+ else
+ {
+ if(ext->vc_ui == MMI_VC_UI_CONNECTED)
+ {
+ char tmp[20] = "";
+ char str[30] = "";
+ voip_get_time_elaps(ext->connect_start_time, tmp, 20);
+ snprintf(str, 30, "%s(%s)", (char *)lv_lang_get_text(WATCH_TEXT_ID_RING_OFF), tmp);
+ lv_label_set_text(label, str);
+ }
+ else
+ {
+ lv_label_set_text_id(label, WATCH_TEXT_ID_RING_OFF);
+ }
+ }
+
+ lv_obj_set_click(label, false);
+
+ return(obj);
+}
+
+static void voip_anim_fp_connecting_ring(lv_obj_t * obj, int32_t x)
+{
+ if(obj != NULL) {
+ lv_obj_set_x(obj, x);
+ }
+}
+
+static void mmi_vc_connecting_animation(lv_obj_t * par)
+{
+ lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+
+ LV_ASSERT_MEM(ext);
+ if(ext == NULL) {
+ return;
+ }
+
+ lv_obj_t * img = lv_img_create(mmi_vc_call_get_obj(), NULL);
+ lv_img_set_src(img, LV_SYMBOL_LOOP);
+ lv_obj_add_style(img, LV_OBJ_PART_MAIN, &lv_watch_image);
+ lv_obj_set_style_local_text_font(img, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, LV_THEME_WATCH_NIGHT_SYMBOL_NORMAL);
+ lv_obj_set_y(img, lv_obj_get_y(par) + lv_obj_get_y(lv_obj_get_parent(par)));
+ ext->phone_animation_obj = img;
+
+ /*Create an animation to move the button continuously left to right*/
+ lv_anim_t a;
+ lv_anim_path_t path;
+ lv_anim_value_t start = lv_obj_get_x(par) + lv_obj_get_width(par) + 6;
+ lv_anim_value_t end = start + 30;
+
+ lv_anim_path_init(&path);
+ lv_anim_path_set_cb(&path, lv_anim_path_linear);
+
+ lv_anim_init(&a);
+ lv_anim_set_var(&a, img);
+ lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)voip_anim_fp_connecting_ring);
+ lv_anim_set_path(&a, &path);
+ lv_anim_set_values(&a, start, end);
+ lv_anim_set_time(&a, 400);
+ lv_anim_set_playback_time(&a, 400);
+ lv_anim_set_playback_delay(&a, 0);
+ lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
+ lv_anim_set_repeat_delay(&a, 500);
+
+ lv_anim_start(&a);
+}
+
+static void voip_anim_fp_dialing_ring(lv_obj_t * obj, int32_t x)
+{
+ if(obj != NULL) {
+ lv_obj_set_x(obj, x);
+ }
+}
+
+static void mmi_vc_dialing_animation(lv_obj_t * par)
+{
+ lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+
+ LV_ASSERT_MEM(ext);
+ if(ext == NULL) {
+ return;
+ }
+
+ lv_obj_t * img = lv_img_create(mmi_vc_call_get_obj(), NULL);
+ lv_img_set_src(img, LV_SYMBOL_RIGHT);
+ lv_obj_add_style(img, LV_OBJ_PART_MAIN, &lv_watch_image);
+ lv_obj_set_style_local_text_font(img, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, LV_THEME_WATCH_NIGHT_SYMBOL_NORMAL);
+ lv_obj_set_y(img, lv_obj_get_y(par) + lv_obj_get_y(lv_obj_get_parent(par)));
+ ext->phone_animation_obj = img;
+
+ /*Create an animation to move the button continuously left to right*/
+ lv_anim_t a;
+ lv_anim_path_t path;
+ lv_anim_value_t start = lv_obj_get_x(par) + lv_obj_get_width(par) + 6;
+ lv_anim_value_t end = start + 30;
+
+ lv_anim_path_init(&path);
+ lv_anim_path_set_cb(&path, lv_anim_path_linear);
+
+ lv_anim_init(&a);
+ lv_anim_set_var(&a, img);
+ lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)voip_anim_fp_dialing_ring);
+ lv_anim_set_path(&a, &path);
+ lv_anim_set_values(&a, start, end);
+ lv_anim_set_time(&a, 400);
+ lv_anim_set_playback_time(&a, 400);
+ lv_anim_set_playback_delay(&a, 0);
+ lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
+ lv_anim_set_repeat_delay(&a, 500);
+
+ lv_anim_start(&a);
+}
+
+static void mmi_vc_ring_animation(lv_obj_t * par)
+{
+ lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+
+ LV_ASSERT_MEM(ext);
+ if(ext == NULL) {
+ return;
+ }
+
+ lv_obj_t * img = lv_img_create(mmi_vc_call_get_obj(), NULL);
+ lv_img_set_src(img, LV_SYMBOL_LEFT);
+ lv_obj_add_style(img, LV_OBJ_PART_MAIN, &lv_watch_image);
+ lv_obj_set_style_local_text_font(img, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, LV_THEME_WATCH_NIGHT_SYMBOL_NORMAL);
+ lv_obj_set_y(img, lv_obj_get_y(par) + lv_obj_get_y(lv_obj_get_parent(par)));
+ ext->phone_animation_obj = img;
+
+ /*Create an animation to move the button continuously left to right*/
+ lv_anim_t a;
+ lv_anim_path_t path;
+ lv_anim_value_t start = lv_obj_get_x(par) - 20;
+ lv_anim_value_t end = start - 30;
+
+ lv_anim_path_init(&path);
+ lv_anim_path_set_cb(&path, lv_anim_path_linear);
+
+ lv_anim_init(&a);
+ lv_anim_set_var(&a, img);
+ lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)voip_anim_fp_dialing_ring);
+ lv_anim_set_path(&a, &path);
+ lv_anim_set_values(&a, start, end);
+ lv_anim_set_time(&a, 400);
+ lv_anim_set_playback_time(&a, 400);
+ lv_anim_set_playback_delay(&a, 0);
+ lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
+ lv_anim_set_repeat_delay(&a, 500);
+
+ lv_anim_start(&a);
+}
+
+static void mmi_vc_anim_fp_connected(lv_anim_t * anim)
+{
+ lv_obj_t * obj = (lv_obj_t *)anim->var;
+ lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+
+ LV_ASSERT_MEM(ext);
+ if(ext == NULL) {
+ return;
+ }
+
+ char str[20] = "";
+ voip_get_time_elaps(ext->connect_start_time, str, 20);
+ if(obj) {
+ lv_label_set_text(obj, str);
+ }
+}
+
+static void mmi_vc_connected_animation(lv_obj_t * obj)
+{
+ lv_anim_t a;
+ lv_anim_path_t path;
+
+ lv_anim_path_init(&path);
+ lv_anim_path_set_cb(&path, lv_anim_path_step);
+
+ lv_anim_init(&a);
+ lv_anim_set_var(&a, obj);
+ lv_anim_set_start_cb(&a, (lv_anim_ready_cb_t)mmi_vc_anim_fp_connected);
+ lv_anim_set_path(&a, &path);
+ lv_anim_set_time(&a, 1);
+ lv_anim_set_playback_time(&a, 0);
+ lv_anim_set_playback_delay(&a, 0);
+ lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
+ lv_anim_set_repeat_delay(&a, 1000);
+
+ lv_anim_start(&a);
+}
+
+static void voip_get_time_elaps(uint32_t last_time, char * str, int8_t size)
+{
+ hal_rtc_t rtc_curr; // current rtc time
+ uint32_t second_curr = 0; // seconds of current time
+
+ Hal_Rtc_Gettime(&rtc_curr);
+ second_curr = time_to_seconds(&rtc_curr);
+
+ uint32_t elaps = second_curr - last_time;
+ uint32_t seconds = elaps % 60;
+ uint32_t minutes = elaps / 60;
+ uint32_t hours = minutes / 60;
+ minutes = minutes % 60;
+
+ if(hours == 0) {
+ if(lv_lang_act() == LANG_CH) {
+ snprintf(str, size, "%.2d:%.2d", minutes, seconds);
+ } else {
+ snprintf(str, size, "%.2d:%.2d", minutes, seconds);
+ }
+ } else {
+ if(lv_lang_act() == LANG_CH) {
+ snprintf(str, size, "%.2d:%.2d:%.2d", hours, minutes, seconds);
+ } else {
+ snprintf(str, size, "%.2d:%.2d:%.2d", hours, minutes, seconds);
+ }
+ }
+}
+
+void mmi_vc_ring_off_no_carrier(uint8_t isNoCarrier)
+{
+ if((false == s_video_call_params.ring_off_timeout)
+ && (1 == isNoCarrier)
+ && (MMI_VIDEO_CALL_STATE_NONE == s_video_call_params.state))
+ {
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ return;
+ }
+
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ // stop playing tone
+ Hal_Tone_Play_End();
+
+ // stop timer
+ mmi_vc_ring_off_timer_stop();
+ mmi_vc_dialing_timer_stop();
+ mmi_vc_connecting_timer_stop();
+
+ // create ring off UI
+ lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE);
+ if(activity_obj)
+ {
+ mmi_video_call_phone_ring_off_create();
+ }
+
+ if(MMI_MODEM_CALL_STATE_NULL != phone_get_call_state())
+ {
+ printf("%s tele call is on going, keep para of audio\n", __FUNCTION__);
+ Hal_Set_Voice_Call_Status(VOICE_CALL_END);
+ Hal_Disconnect_BT_Audio_Path();
+ }
+ Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
+ watch_wakeup_time_reset();
+
+ Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+}
+
+static bool mmi_vc_check_mo_permission(void)
+{
+ if((!watch_modem_sim_present_check_req())
+ || (MMI_MODEM_SIGNAL_BAR_0 == watch_modem_get_signal_bar_req())
+// || (MODEM_VIDEO_CALL_REG_OK != watch_modem_video_call_get_reg_stat_req())
+ || (is_rat_gsm())
+ )
+ {
+ return false;
+ }
+
+ return true;
+}
+
+static void voip_local_remote_switch_action(lv_obj_t * btn, lv_event_t e)
+{
+ if(LV_EVENT_CLICKED != e) {
+ return;
+ }
+
+ printf("%s %d\n", __FUNCTION__, __LINE__);
+ lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_VOIPPHONE);
+ if(!activity_obj) {
+ return;
+ }
+ lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+ if(!ext) {
+ return;
+ }
+ if(ext->local_remote_switch_flag == VOIP_REMOTE_SWITCH_NULL) {
+ return;
+ }
+ if(ext->local_remote_switch_flag == VOIP_REMOTE_SWITCH_REMOTE) {
+ ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_LOCAL;
+ } else {
+ ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_REMOTE;
+ }
+}
+
+static lv_res_t video_call_element_signal_func(lv_obj_t * element, lv_signal_t sign, void * param)
+{
+ lv_res_t res;
+
+ //printf("%s, sign=%d\n", __FUNCTION__, sign);
+ /* if not click signs, invoke ancient handler and return */
+ if(sign != LV_SIGNAL_PRESSING && sign != LV_SIGNAL_PRESSED && sign != LV_SIGNAL_RELEASED && sign != LV_SIGNAL_PRESS_LOST) {
+ /* Include the ancient signal function */
+ lv_signal_cb_t sign_func = (lv_signal_cb_t)(lv_obj_get_user_data(element).user_data);
+ res = sign_func(element, sign, param);
+ if(res != LV_RES_OK) {
+ return(res);
+ }
+
+ return(LV_RES_OK);
+ }
+
+ lv_obj_t * obj = lv_obj_get_parent(element);
+ while(obj) {
+ if(lv_obj_get_signal_cb(obj) != lv_watch_obj_signal) {
+ obj = lv_obj_get_parent(obj);
+ } else {
+ break;
+ }
+ }
+ if(obj == NULL) {
+ return(LV_RES_INV);
+ }
+
+ res = lv_watch_obj_signal(obj, sign, param);
+ if(res != LV_RES_OK) {
+ return(res);
+ }
+
+ /* Include the ancient signal function */
+ lv_signal_cb_t sign_func = (lv_signal_cb_t)(lv_obj_get_user_data(element).user_data);
+ res = sign_func(element, sign, param);
+ if(res != LV_RES_OK) {
+ return(res);
+ }
+
+ return(LV_RES_OK);
+} /* video_call_element_signal_func */
+
+static void video_call_add_element(lv_obj_t * element)
+{
+ lv_watch_set_free_ptr(element, lv_obj_get_signal_cb(element));
+ lv_obj_set_signal_cb(element, video_call_element_signal_func);
+ lv_obj_add_protect(element, LV_PROTECT_PRESS_LOST | LV_PROTECT_CLICK_FOCUS);
+}
+
+static void canvas_button_hidden_event_cb(lv_obj_t * obj, lv_event_t e)
+{
+ if(LV_EVENT_CLICKED == e)
+ {
+ printf("%s %d\n", __FUNCTION__, __LINE__);
+ lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+ if(!ext) {
+ return;
+ }
+ if(ext->canvas_button_hidden_flag == NOT_HIDDEN) {
+ ext->canvas_button_hidden_flag = HIDDEN;
+ } else {
+ ext->canvas_button_hidden_flag = NOT_HIDDEN;
+ }
+
+ lv_obj_set_hidden(ext->connect_time, ext->canvas_button_hidden_flag);
+ lv_obj_set_hidden(ext->volume_button, ext->canvas_button_hidden_flag);
+ lv_obj_set_hidden(ext->view_switch_button, true); // lv_obj_set_hidden(ext->view_switch_button, ext->canvas_button_hidden_flag);
+ lv_obj_set_hidden(ext->ring_off_button, ext->canvas_button_hidden_flag);
+ }
+}
+
+static void voip_set_volume_when_slider_act(void)
+{
+ printf("%s\n", __FUNCTION__);
+ if(lv_watch_get_activity_obj(ACT_ID_SLIDER)) {
+ if(MMI_VIDEO_CALL_STATE_NONE != s_video_call_params.state) {
+ uint8_t volume = mmi_vc_get_call_volume_fzd();
+ printf("set nv, speaker volume is %d.\n", volume);
+ UI_NV_Write_Req(NV_SECTION_UI_PHONE, 0, 1, &volume);
+ }
+ }
+}
+
+#if VIDEO_SIGNAL_CHECK
+static void signal_check(lv_task_t *task)
+{
+ lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+ if(!ext) return;
+
+ if((false == is_rat_gsm()) &&
+ (watch_modem_get_signal_bar_req() < MMI_MODEM_SIGNAL_BAR_3)) {
+ lv_obj_set_hidden(ext->signal_weak_label, false);
+ } else {
+ lv_obj_set_hidden(ext->signal_weak_label, true);
+ }
+}
+#endif
+
+static void voip_signal_check_start(void * ext)
+{
+#if VIDEO_SIGNAL_CHECK
+ if(NULL == signal_check_task)
+ signal_check_task = lv_task_create(signal_check, VIDEO_SIGNAL_CHECK_PERIOD, LV_TASK_PRIO_HIGH, NULL);
+#endif
+}
+
+static void voip_signal_check_stop(void)
+{
+#if VIDEO_SIGNAL_CHECK
+ if(signal_check_task) {
+ lv_task_del(signal_check_task);
+ signal_check_task = NULL;
+ }
+#endif
+}
+
+static bool is_rat_gsm(void)
+{
+ MMI_MODEM_PLMN_RAT rat;
+
+ watch_modem_get_operator_req(&rat);
+ if(MMI_MODEM_PLMN_RAT_GSM == rat)
+ return true;
+ else
+ return false;
+}
+
+static void rat_check(lv_task_t *task)
+{
+ if(is_rat_gsm()) {
+ mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);
+ }
+}
+
+static void voip_rat_check_start(void)
+{
+ if(NULL == rat_check_task)
+ rat_check_task = lv_task_create(rat_check, VIDEO_RAT_CHECK_PERIOD, LV_TASK_PRIO_HIGH, NULL);
+}
+
+static void voip_rat_check_stop(void)
+{
+ if(rat_check_task) {
+ lv_task_del(rat_check_task);
+ rat_check_task = NULL;
+ }
+}
+
+void voip_fps_check(int8_t fps)
+{
+ lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+ if(NULL != ext) {
+ if((VIDEO_CALL_FPS_CHECK_LIMIT >= fps) && (0 != fps)) {
+ printf("%s %d\n", __FUNCTION__, fps);
+ if(lv_obj_get_hidden(ext->signal_weak_label) == false) return;
+ lv_obj_set_hidden(ext->signal_weak_label, false);
+ } else {
+ if(lv_obj_get_hidden(ext->signal_weak_label) == true) return;
+ lv_obj_set_hidden(ext->signal_weak_label, true);
+ }
+ }
+}
+
+
+
+
+static nv_watch_vc_contact_t s_vc_contact = {0};
+static TIMER_ID fail_timer_id = NULL;
+static MMI_VIDEO_CALL_UI_E s_vc_call_ui = MMI_VC_UI_INVALID;
+
+char * mmi_video_call_params_number_get(void)
+{
+ return (s_video_call_params.number);
+}
+
+MMI_VIDEO_CALL_STATE_E mmi_video_call_params_state_get(void)
+{
+ return (s_video_call_params.state);
+}
+
+MODEM_VIDEO_CALL_TYPE mmi_video_call_params_type_get(void)
+{
+ return (s_video_call_params.call_type);
+}
+
+
+
+void mmi_video_call_contact_nv_write(void)
+{
+ uint32_t nv_data_length = sizeof(nv_watch_vc_contact_t);
+
+ if(nv_data_length != UI_NV_Write_Req(NV_SECTION_UI_VC_CONTACT, 0, nv_data_length, (uint8_t *)&s_vc_contact))
+ {
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: nv write fail\n", __FUNCTION__, __LINE__);
+ }
+}
+
+void mmi_video_call_contact_nv_read(void)
+{
+ uint32_t nv_data_length = sizeof(nv_watch_vc_contact_t);
+
+ if(nv_data_length != UI_NV_Read_Req(NV_SECTION_UI_VC_CONTACT, 0, nv_data_length, (uint8_t *)&s_vc_contact))
+ {
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: nv read fail\n", __FUNCTION__, __LINE__);
+ }
+}
+
+void mmi_vc_contact_set(nv_watch_vc_contact_t * contact_list)
+{
+ if(NULL == contact_list)
+ {
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ return;
+ }
+
+ _lv_memcpy(&s_vc_contact, contact_list, sizeof(nv_watch_vc_contact_t));
+ mmi_video_call_contact_nv_write();
+
+
+ //phonebook_update_ui(contact_list, count, 0, 0);
+
+}
+
+// state: 0-reject; 1-hang up
+void mmi_vc_call_operate_send_to_server(uint_8 flag)
+{
+ if(0 == flag)
+ mmi_protocol_fzd_action_VC_CALL_RESPONSE(s_video_call_params.number, s_video_call_ticket, s_video_call_params.call_type);
+ else if(1 == flag)
+ mmi_protocol_fzd_action_VC_CALL_RESPONSE(NULL, NULL, 0);
+}
+
+void mmi_vc_ring_off_timer_stop(void)
+{
+ if(NULL != s_video_call_params.ring_off_timer_id)
+ {
+ Hal_Timer_Stop(s_video_call_params.ring_off_timer_id);
+ s_video_call_params.ring_off_timer_id = NULL;
+ }
+}
+
+void mmi_vc_dialing_timer_stop(void)
+{
+ if(NULL != s_video_call_params.dialing_timer_id)
+ {
+ Hal_Timer_Stop(s_video_call_params.dialing_timer_id);
+ s_video_call_params.dialing_timer_id = NULL;
+ }
+}
+
+void mmi_vc_connecting_timer_stop(void)
+{
+ if(NULL != s_video_call_params.connecting_timer_id)
+ {
+ Hal_Timer_Stop(s_video_call_params.connecting_timer_id);
+ s_video_call_params.connecting_timer_id = NULL;
+ }
+}
+
+static void mmi_vc_ui_prepare_destory(lv_obj_t * activity_obj)
+{
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_watch_png_cache_all_free();
+
+ // stop playing tone
+ Hal_Tone_Play_End();
+
+ // ring off
+ mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);
+
+ // stop ring off timer
+ mmi_vc_ring_off_timer_stop();
+
+ // stop callreq timer
+ mmi_vc_dialing_timer_stop();
+
+ //stop
+ mmi_vc_connecting_timer_stop();
+
+ Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+ s_video_call_params.state = MMI_VIDEO_CALL_STATE_NONE;
+}
+
+static void mmi_vc_hook_action(lv_obj_t * btn, lv_event_t e)
+{
+ if(LV_EVENT_CLICKED != e)
+ {
+ return;
+ }
+
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ //if(btn) {
+ // lv_obj_set_click(btn, false);
+ //}
+
+ Hal_Tone_Play_End();
+
+ mmi_vc_call_action_connecting();
+
+ //mmi_video_call_jrtc_config_init_01(s_video_call_tokens);
+ int8_t ret = mmi_video_call_answer_req(s_video_call_ticket);
+ if(ret < 0)
+ {
+ mmi_vc_ring_off_no_carrier(0);
+ }
+}
+
+
+lv_res_t mmi_video_call_phone_ring_off_create()
+{
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+ if(ext == NULL)
+ {
+ return(LV_RES_INV);
+ }
+
+ // stop callreq timer
+ mmi_vc_dialing_timer_stop();
+
+ if(ext->vc_ui == MMI_VC_UI_INCOMING || ext->vc_ui == MMI_VC_UI_DIALING)
+ {
+ if(ext->phone_status_label) {
+ lv_label_set_text(ext->phone_status_label, "");
+ }
+
+ voip_ring_off_content_create(mmi_vc_call_get_obj());
+ }
+ else if(ext->vc_ui == MMI_VC_UI_CONNECTED)
+ {
+ voip_ring_off_content_create(mmi_vc_call_get_obj());
+ }
+
+ if(ext->phone_animation_obj) {
+ lv_obj_del(ext->phone_animation_obj);
+ ext->phone_animation_obj = NULL;
+ }
+
+ /* set speaker volume to nv when leaving activiry's slider */
+ voip_set_volume_when_slider_act();
+
+ /* phone cleanup when anim end*/
+ lv_anim_t a;
+ lv_anim_init(&a);
+ lv_anim_set_var(&a, mmi_vc_call_get_obj());
+ lv_anim_set_ready_cb(&a, (lv_anim_ready_cb_t)voip_phone_obj_hide_anim_end);
+ lv_anim_set_time(&a, VOIP_PHONE_RING_OFF_CONTINUE_TIME);
+ lv_anim_start(&a);
+
+ voip_signal_check_stop();
+ voip_rat_check_stop();
+
+ return(LV_RES_OK);
+}
+
+static void mmi_vc_ring_off_timeout_cb(void * para)
+{
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ s_video_call_params.ring_off_timer_id = NULL;
+ s_video_call_params.ring_off_timeout = true;
+ mmi_vc_ring_off_no_carrier(0);
+}
+
+void mmi_vc_ring_off_action(lv_obj_t * btn, lv_event_t e)
+{
+ if(LV_EVENT_CLICKED != e)
+ {
+ return;
+ }
+
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, s_video_call_params.state);
+
+ mmi_vc_dialing_timer_stop();
+ mmi_vc_connecting_timer_stop();
+
+ if(false == s_video_call_params.ring_off)
+ {
+ s_video_call_params.ring_off = true;
+
+ if(NULL == s_video_call_params.ring_off_timer_id)
+ {
+ s_video_call_params.ring_off_timer_id = Hal_Timer_Start(VOIP_RING_OFF_TIMER_LEN, mmi_vc_ring_off_timeout_cb, NULL, 0);
+ }
+ }
+
+ switch(s_video_call_params.state)
+ {
+ case MMI_VIDEO_CALL_STATE_NONE:
+ case MMI_VIDEO_CALL_STATE_INVALID:
+ // do noting
+ break;
+
+ case MMI_VIDEO_CALL_STATE_CALLING:
+ mmi_video_call_hangup_req(TRUE);
+ break;
+
+ case MMI_VIDEO_CALL_STATE_INCOMING:
+ Hal_Tone_Play_End();
+ mmi_video_call_reject_req(TRUE);
+ break;
+
+ default:
+ mmi_video_call_hangup_req(TRUE);
+ break;
+ }
+
+ voip_signal_check_stop();
+ voip_rat_check_stop();
+}
+
+void mmi_ui_msg_update_vc_call_stop(void)
+{
+ mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);
+}
+
+void mmi_vc_call_action_call_stop(void)
+{
+ mmi_watch_wake_up();
+ mmi_ui_msg_action_vc_call_stop();
+}
+
+static void mmi_vc_ui_dialing(lv_obj_t * content)
+{
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+ if(ext == NULL)
+ {
+ return;
+ }
+
+ lv_obj_t * label;
+ uint32_t text_id = WATCH_TEXT_ID_VIDEO_CALL_DAILING;
+ if(MODEM_VIDEO_CALL_TYPE_VIDEO != s_video_call_params.call_type)
+ text_id = WATCH_TEXT_ID_VOICE_CALL_DAILING;
+
+ // label dialing
+ label = lv_label_create(content, NULL);
+ lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20);
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_label_set_text_id(label, text_id);
+ lv_obj_set_click(label, false);
+ lv_obj_align(label, content, LV_ALIGN_IN_TOP_MID, 0, 10);
+ ext->phone_status_label = label;
+
+ // img
+ lv_obj_t * img = lv_img_create(content, NULL);
+ lv_img_set_src(img, ICON_VIDEO_CALL_CONTACT_PHOTO);
+ lv_obj_align(img, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
+ lv_obj_set_click(img, false);
+
+ // name
+ label = lv_label_create(content, NULL);
+ lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL);
+ lv_obj_set_width(label, lv_obj_get_width(content) - 20);
+ if(strlen(s_video_call_params.name) > 0)
+ {
+ lv_label_set_text(label, s_video_call_params.name);
+ }
+ else
+ {
+ lv_label_set_text(label, s_video_call_params.number);
+ }
+ lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
+ lv_obj_set_click(label, false);
+
+ #if 0
+ // btn volume
+ lv_obj_t * btn;
+ btn = lv_imgbtn_create(cont, NULL);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_PHONE_RING_VOLUME);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_PHONE_RING_VOLUME);
+ lv_obj_set_event_cb(btn, voip_volume_btn_action);
+ lv_obj_align(btn, cont, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
+ #endif
+
+ // btn ring off
+ lv_obj_t * btn = lv_imgbtn_create(content, NULL);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN);
+ lv_obj_set_event_cb(btn, mmi_vc_ring_off_action);
+ lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_MID, 0, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+}
+
+static void mmi_vc_ui_incoming(lv_obj_t * content)
+{
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+ if(ext == NULL)
+ {
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ return;
+ }
+ lv_obj_t * label;
+ uint32_t text_id = WATCH_TEXT_ID_VIDEO_CALL_RINGING;
+ if(MODEM_VIDEO_CALL_TYPE_VIDEO != s_video_call_params.call_type)
+ text_id = WATCH_TEXT_ID_VOICE_CALL_RINGING;
+
+ // label ringing
+ label = lv_label_create(content, NULL);
+ lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20);
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_label_set_text_id(label, text_id);
+ lv_obj_set_click(label, false);
+ lv_obj_align(label, content, LV_ALIGN_IN_TOP_MID, 0, 10);
+ ext->phone_status_label = label;
+
+ // img
+ lv_obj_t * img = lv_img_create(content, NULL);
+ lv_img_set_src(img, ICON_VIDEO_CALL_CONTACT_PHOTO);
+ lv_obj_align(img, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
+ lv_obj_set_click(img, false);
+
+ // name
+ label = lv_label_create(content, NULL);
+ lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL);
+ lv_obj_set_width(label, lv_obj_get_width(content) - 20);
+ if(strlen(s_video_call_params.name) > 0)
+ {
+ lv_label_set_text(label, s_video_call_params.name);
+ }
+ else
+ {
+ lv_label_set_text(label, s_video_call_params.number);
+ }
+ lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
+ lv_obj_set_click(label, false);
+
+ // btn ring off
+ lv_obj_t * btn;
+ btn = lv_imgbtn_create(content, NULL);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN);
+ lv_obj_set_event_cb(btn, mmi_vc_ring_off_action);
+ lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_LEFT, MMI_VC_INCOMING_RING_OFF_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+
+ // btn ring hook
+ btn = lv_imgbtn_create(content, NULL);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_ANSWER_BTN);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_ANSWER_BTN);
+ lv_obj_set_event_cb(btn, mmi_vc_hook_action);
+ lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_VC_INCOMING_HOOK_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+}
+
+static void mmi_vc_ui_connecting(lv_obj_t * content)
+{
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+
+ LV_ASSERT_MEM(ext);
+ if(ext == NULL) {
+ return;
+ }
+ lv_obj_t * label;
+
+ // label ringing
+ label = lv_label_create(content, NULL);
+ lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20);
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_label_set_text_id(label, WATCH_TEXT_ID_CONNECTING);
+ lv_obj_set_click(label, false);
+ lv_obj_align(label, content, LV_ALIGN_IN_TOP_MID, 0, 10);
+ ext->phone_status_label = label;
+
+ // img
+ lv_obj_t * img = lv_img_create(content, NULL);
+ lv_img_set_src(img, ICON_VIDEO_CALL_CONTACT_PHOTO);
+ lv_obj_align(img, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
+ lv_obj_set_click(img, false);
+
+ // name
+ label = lv_label_create(content, NULL);
+ lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL);
+ lv_obj_set_width(label, lv_obj_get_width(content) - 20);
+ if(strlen(s_video_call_params.name) > 0)
+ {
+ lv_label_set_text(label, s_video_call_params.name);
+ }
+ else
+ {
+ lv_label_set_text(label, s_video_call_params.number);
+ }
+ lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
+ lv_obj_set_click(label, false);
+
+ // btn ring off
+ lv_obj_t * btn = lv_imgbtn_create(content, NULL);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN);
+ lv_obj_set_event_cb(btn, mmi_vc_ring_off_action);
+ lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_MID, 0, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+}
+
+static void mmi_vc_ui_connected(lv_obj_t * content)
+{
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_vc_call_obj_ext_t * ext = mmi_vc_call_get_ext();
+ if(ext == NULL)
+ {
+ return;
+ }
+
+ lv_obj_t * label;
+ lv_obj_t * btn;
+ hal_rtc_t rtc_curr = {0}; // current rtc time
+ Hal_Rtc_Gettime(&rtc_curr);
+
+ if(s_video_call_params.call_type == MODEM_VIDEO_CALL_TYPE_VOICE)
+ {
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ ext->connect_start_time = time_to_seconds(&rtc_curr);
+
+ ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_NULL;
+
+ //lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
+ lv_obj_t * img = lv_img_create(content, NULL);
+ lv_img_set_src(img, ICON_VIDEO_CALL_CONTACT_PHOTO);
+ lv_obj_align(img, content, LV_ALIGN_IN_TOP_MID, 0, 30);
+ lv_obj_set_click(img, false);
+
+ // name
+ label = lv_label_create(content, NULL);
+ lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL);
+ lv_obj_set_width(label, lv_obj_get_width(content) - 20);
+ if(strlen(s_video_call_params.name) > 0)
+ {
+ lv_label_set_text(label, s_video_call_params.name);
+ }
+ else
+ {
+ lv_label_set_text(label, s_video_call_params.number);
+ }
+ lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
+ lv_obj_set_click(label, false);
+
+ //duration
+ lv_obj_t * time_label = lv_label_create(content, NULL);
+ lv_obj_add_style(time_label, LV_OBJ_PART_MAIN, &lv_watch_font20);
+ lv_label_set_align(time_label, LV_LABEL_ALIGN_CENTER);
+ lv_label_set_text(time_label, "00:00");
+ lv_obj_set_click(time_label, false);
+ lv_obj_set_base_dir(time_label, LV_BIDI_DIR_LTR);
+ lv_obj_align(time_label, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
+ ext->phone_status_label = time_label;
+
+ //btn volume
+ btn = lv_imgbtn_create(content, NULL);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VOLUME_BTN);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VOLUME_BTN);
+ lv_obj_set_event_cb(btn, voip_volume_btn_action);
+ lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_LEFT, MMI_VC_CALLING_VOLUME_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET); //20, -50);
+
+ //btn ring off
+ btn = lv_imgbtn_create(content, NULL);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN);
+ lv_obj_set_event_cb(btn, mmi_vc_ring_off_action);
+ lv_obj_align(btn, content, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_VC_CALLING_RING_OFF_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET); //-20, -50);
+ }
+ else
+ {
+ lv_obj_t * canvas;
+
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: format=%d\n", __FUNCTION__, __LINE__, ext->voiph263fmt);
+
+ ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_REMOTE;
+ if((ext->voiph263fmt == VOIP_H263_FMT_SQCIF) || (ext->voiph263fmt == VOIP_H263_FMT_QCIF))
+ {
+ ext->connect_start_time = time_to_seconds(&rtc_curr);
+
+ /*Create the canvas object*/
+ canvas = lv_canvas_create(content, NULL);
+ lv_obj_set_click(canvas, true);
+ lv_obj_set_event_cb(canvas, canvas_button_hidden_event_cb);
+ video_call_add_element(canvas);
+ ext->canvas = canvas;
+
+ lv_obj_align(canvas, content, LV_ALIGN_IN_TOP_MID, 0, 0);
+ /*Assign the buffer to the canvas*/
+ lv_img_set_src(canvas, ICON_BACKGROUND);
+ voip_signal_check_start(ext);
+
+ // duration
+ label = lv_label_create(canvas, NULL);
+ lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20);
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_label_set_text(label, "0:0");
+ lv_obj_set_click(label, false);
+ lv_obj_set_base_dir(label, LV_BIDI_DIR_LTR);
+ lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 0);
+ ext->phone_status_label = label;
+
+ // signal weak notification
+ label = lv_label_create(canvas, NULL);
+ lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+ lv_label_set_text_id(label, WATCH_TEXT_ID_SIGNAL_WEAK);
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_obj_align(label, canvas, LV_ALIGN_CENTER, 0, -10);
+ lv_obj_set_click(label, false);
+ lv_obj_set_hidden(label, true);
+ ext->signal_weak_label = label;
+
+ // btn volume
+ btn = lv_imgbtn_create(canvas, NULL);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VOLUME_BTN);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VOLUME_BTN);
+ lv_obj_set_event_cb(btn, voip_volume_btn_action);
+ lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_LEFT, MMI_VC_CALLING_VOLUME_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+
+ // btn switch video
+ //btn = lv_imgbtn_create(canvas, NULL);
+ //lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_SETTING_VOLTE);
+ //lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_SETTING_VOLTE);
+ //lv_obj_set_event_cb(btn, voip_local_remote_switch_action);
+ //lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
+
+ // btn ring off
+ btn = lv_imgbtn_create(canvas, NULL);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN);
+ lv_obj_set_event_cb(btn, mmi_vc_ring_off_action);
+ lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_VC_CALLING_RING_OFF_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+ }
+ else if((ext->voiph263fmt == VOIP_H263_FMT_CIF)
+ || (ext->voiph263fmt == VOIP_H263_FMT_4CIF)
+ || (ext->voiph263fmt == VOIP_H263_FMT_16CIF)
+ || (ext->voiph263fmt == VOIP_H263_FMT_OTHER))
+ {
+ /*Create the canvas object*/
+ canvas = lv_canvas_create(content, NULL);
+ lv_obj_set_click(canvas, true);
+ lv_obj_set_event_cb(canvas, canvas_button_hidden_event_cb);
+ video_call_add_element(canvas);
+ ext->canvas = canvas;
+
+ /*Assign the buffer to the canvas*/
+ lv_img_set_src(canvas, ICON_BACKGROUND);
+ voip_signal_check_start(ext);
+
+ // duration
+ label = lv_label_create(canvas, NULL);
+ lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font20);
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_label_set_text(label, "0:0");
+ lv_obj_set_click(label, false);
+ lv_obj_set_base_dir(label, LV_BIDI_DIR_LTR);
+ lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 0);
+ ext->phone_status_label = label;
+ ext->connect_time = label;
+
+ // signal weak notification
+ label = lv_label_create(canvas, NULL);
+ lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+ lv_label_set_text_id(label, WATCH_TEXT_ID_SIGNAL_WEAK);
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_obj_align(label, canvas, LV_ALIGN_CENTER, 0, -10);
+ lv_obj_set_click(label, false);
+ lv_obj_set_hidden(label, true);
+ ext->signal_weak_label = label;
+
+ // btn volume
+ btn = lv_imgbtn_create(canvas, NULL);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VOLUME_BTN);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VOLUME_BTN);
+ lv_obj_set_event_cb(btn, voip_volume_btn_action);
+ lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_LEFT, MMI_VC_CALLING_VOLUME_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+ lv_obj_add_style(btn, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
+ ext->volume_button = btn;
+
+ // btn switch video
+ btn = lv_imgbtn_create(canvas, NULL);
+ //lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_SETTING_VOLTE);
+ //lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_SETTING_VOLTE);
+ //lv_obj_set_event_cb(btn, voip_local_remote_switch_action);
+ //lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_MID, 0, -20);
+ //lv_obj_add_style(btn, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
+ ext->view_switch_button = btn;
+
+ // btn ring off
+ btn = lv_imgbtn_create(canvas, NULL);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_HANGUP_BTN);
+ lv_imgbtn_set_src(btn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_HANGUP_BTN);
+ lv_obj_set_event_cb(btn, mmi_vc_ring_off_action);
+ lv_obj_align(btn, canvas, LV_ALIGN_IN_BOTTOM_RIGHT, MMI_VC_CALLING_RING_OFF_BTN_X_OFFSET, MMI_VC_RING_OFF_BTN_Y_OFFSET);
+ lv_obj_add_style(btn, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
+ ext->ring_off_button = btn;
+
+ lv_obj_set_hidden(ext->connect_time, ext->canvas_button_hidden_flag);
+ lv_obj_set_hidden(ext->volume_button, ext->canvas_button_hidden_flag);
+ lv_obj_set_hidden(ext->view_switch_button, true); // lv_obj_set_hidden(ext->view_switch_button, ext->canvas_button_hidden_flag);
+ lv_obj_set_hidden(ext->ring_off_button, ext->canvas_button_hidden_flag);
+ }
+
+ if(mmi_vc_call_get_obj()) {
+ lv_watch_obj_set_down_slide_cb(mmi_vc_call_get_obj(), voip_phone_down_slide_callback);
+ }
+ }
+}
+
+static lv_obj_t * mmi_vc_ui_create(lv_obj_t * activity_obj)
+{
+ if(MMI_VC_UI_CONNECTED == s_vc_call_ui)
+ {
+ /* set speaker volume to nv when leaving activiry's slider */
+ voip_set_volume_when_slider_act();
+ }
+
+ mmi_vc_call_screen_clean();
+
+ //lv_watch_png_cache_all_free();
+
+ if(activity_obj == NULL)
+ {
+ lv_watch_activity_ext_t activity_ext = {0};
+
+ activity_ext.actId = ACT_ID_VOIPPHONE;
+ activity_ext.create = NULL; // mmi_vc_ui_create;
+ activity_ext.prepare_destory = mmi_vc_ui_prepare_destory;
+ activity_obj = lv_watch_creat_activity_obj(&activity_ext);
+ if(NULL == activity_obj)
+ {
+ return NULL;
+ }
+ }
+
+ lv_obj_t * obj = lv_watch_obj_create(activity_obj);
+ if(obj == NULL)
+ {
+ return NULL;
+ }
+ lv_watch_obj_set_anim_mode(obj, LV_WATCH_LEFT_OR_RIGHT_SLIDE_CALLBACK);
+ lv_watch_obj_set_left_slide_cb(obj, voip_phone_left_slide_callback);
+ lv_watch_obj_set_right_slide_cb(obj, voip_phone_right_slide_callback);
+
+ lv_vc_call_obj_ext_t * ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_vc_call_obj_ext_t));
+ if(ext == NULL)
+ {
+ return NULL;
+ }
+
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ ext->phone_status_label = NULL;
+ ext->phone_animation_obj = NULL;
+ ext->vc_ui = s_vc_call_ui;
+ ext->local_remote_switch_flag = VOIP_REMOTE_SWITCH_NULL;
+#if ENABLE_VIDEO_SCALE == 0
+ ext->voiph263fmt = VOIP_H263_FMT_QCIF;
+#else
+ ext->voiph263fmt = VOIP_H263_FMT_OTHER;
+#endif
+
+ hal_rtc_t rtc_curr; // current rtc time
+ Hal_Rtc_Gettime(&rtc_curr);
+ ext->connect_start_time = time_to_seconds(&rtc_curr);
+ ext->connect_time = NULL;
+ ext->volume_button = NULL;
+ ext->view_switch_button = NULL;
+ ext->ring_off_button = NULL;
+ ext->canvas_button_hidden_flag = NOT_HIDDEN;
+
+ /* content */
+ lv_obj_t * content = lv_cont_create(obj, NULL);
+ lv_obj_set_size(content, lv_obj_get_width(obj), lv_obj_get_height(obj));
+ //lv_cont_set_layout(content, LV_LAYOUT_COLUMN_MID);
+ lv_obj_add_style(content, LV_OBJ_PART_MAIN, &lv_watch_style_transp);
+ //lv_obj_set_style_local_bg_color(content, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+ lv_watch_obj_add_element(content);
+ lv_obj_set_click(content, false);
+ lv_obj_align(content, obj, LV_ALIGN_CENTER, 0, 0);
+
+ switch(ext->vc_ui)
+ {
+ case MMI_VC_UI_INCOMING:
+ mmi_vc_ui_incoming(content);
+ //mmi_vc_ring_animation(ext->phone_status_label);
+ break;
+
+ case MMI_VC_UI_DIALING:
+ mmi_vc_ui_dialing(content);
+ //mmi_vc_dialing_animation(ext->phone_status_label);
+ break;
+
+ case MMI_VC_UI_CONNECTING:
+ mmi_vc_ui_connecting(content);
+ //mmi_vc_connecting_animation(ext->phone_status_label);
+ break;
+
+ case MMI_VC_UI_CONNECTED:
+ mmi_vc_ui_connected(content);
+ mmi_vc_connected_animation(ext->phone_status_label);
+ break;
+
+ default:
+ break;
+ }
+
+ return obj;
+}
+
+void mmi_ui_msg_update_vc_call_incoming(void)
+{
+ s_vc_call_ui = MMI_VC_UI_INCOMING;
+ mmi_vc_ui_create(NULL);
+}
+
+void mmi_vc_call_action_incoming(char * number, MODEM_VIDEO_CALL_TYPE type, char * t_ticket, char * t_tokens)
+{
+ if(true == mmi_active_screen_is_prohibit_interrupted()
+ || true == is_rat_gsm()
+ #ifdef __MMI_ZHSX_SUPPORT_DO_NOT_DISTURB__
+ || true == mmi_watch_is_in_do_not_disturb_time()
+ #endif
+ )
+ {
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ mmi_video_call_reject_req(TRUE);
+ return;
+ }
+
+ if(AUDIO_CTRL_PRIORITY_2 == Hal_Audio_Manage_Start_Req(AUDIO_CTRL_PRIORITY_2, mmi_vc_audio_ctrl_callback))
+ {
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+ s_video_call_params.call_type = type;
+ s_video_call_params.state = MMI_VIDEO_CALL_STATE_INCOMING;
+ strncpy(s_video_call_params.number, number, NV_WATCH_VC_CONTACT_NUMBER_LEN - 1);
+ 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);
+
+ HAL_SPEAKER_GAIN volume = query_current_volume();
+ if(!Hal_Set_BT_Audio_Path(volume))
+ {
+ Hal_Call_Speaker(HAL_CALL_SPK_ON, volume);
+ }
+ Hal_NFFS_File_Play_Repeat(AUDIO_INCOMING_CALL, volume);
+
+
+ //
+ mmi_video_call_jrtc_config_init_01(s_video_call_tokens);
+
+
+ mmi_watch_wake_up();
+
+ voip_rat_check_start();
+
+ // ui
+ mmi_ui_msg_action_vc_call_incoming();
+ }
+ else
+ {
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__);
+
+ // auto reject
+ mmi_video_call_reject_req(FALSE);
+ voip_signal_check_stop();
+ voip_rat_check_stop();
+
+ // stop ring off timer
+ mmi_vc_ring_off_timer_stop();
+
+ // stop callreq timer
+ mmi_vc_dialing_timer_stop();
+
+ Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+ voip_set_volume_when_slider_act();
+ mmi_vc_call_screen_clean();
+ lv_watch_png_cache_all_free();
+ Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_2);
+ }
+}
+
+static void mmi_vc_call_connecting_timeout_cb(void * para)
+{
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ mmi_vc_connecting_timer_stop();
+ mmi_video_call_hangup_req(TRUE);
+ //mmi_vc_ring_off_action(NULL, LV_EVENT_CLICKED);
+}
+
+void mmi_vc_call_action_connecting(void)
+{
+ if(MMI_VIDEO_CALL_STATE_CALLING == s_video_call_params.state
+ || MMI_VIDEO_CALL_STATE_CONNECTING == s_video_call_params.state
+ )
+ {
+ return;
+ }
+
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ s_video_call_params.state = MMI_VIDEO_CALL_STATE_CONNECTING;
+
+ // stop timer
+ mmi_vc_dialing_timer_stop();
+ mmi_vc_connecting_timer_stop();
+
+ // stop playing tone
+ Hal_Tone_Play_End();
+
+ //Hal_Set_Voice_Call_Status(VOICE_CALL_START);
+
+ if(NULL == s_video_call_params.connecting_timer_id)
+ {
+ s_video_call_params.connecting_timer_id = Hal_Timer_Start(MMI_VC_CONNECTING_TIMEOUT, mmi_vc_call_connecting_timeout_cb, NULL, 0);
+ }
+
+ s_vc_call_ui = MMI_VC_UI_CONNECTING;
+ mmi_vc_ui_create(NULL);
+}
+
+void mmi_vc_call_action_connected(void)
+{
+ if(MMI_VIDEO_CALL_STATE_CALLING == s_video_call_params.state)
+ {
+ return;
+ }
+
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ s_video_call_params.state = MMI_VIDEO_CALL_STATE_CALLING;
+
+ // stop timer
+ mmi_vc_dialing_timer_stop();
+ mmi_vc_connecting_timer_stop();
+
+ // stop playing tone
+ Hal_Tone_Play_End();
+
+ Hal_Set_Voice_Call_Status(VOICE_CALL_START);
+
+ s_vc_call_ui = MMI_VC_UI_CONNECTED;
+ mmi_vc_ui_create(NULL);
+}
+
+static void mmi_vc_call_dialing_timeout_cb(void * para)
+{
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ mmi_vc_dialing_timer_stop();
+ mmi_video_call_hangup_req(TRUE);
+}
+
+void mmi_vc_call_action_dialing_ext(char * t_tokens, char * t_ticket)
+{
+ memset(s_video_call_ticket, 0x0, MMI_WATCH_VC_TICKET_LEN);
+ strncpy(s_video_call_ticket, t_ticket, MMI_WATCH_VC_TICKET_LEN - 1);
+
+ memset(s_video_call_tokens, 0x0, MMI_WATCH_VC_TOKENS_LEN);
+ strncpy(s_video_call_tokens, t_tokens, MMI_WATCH_VC_TOKENS_LEN - 1);
+
+ mmi_video_call_jrtc_config_init_01(s_video_call_tokens);
+ int8_t ret = mmi_video_call_dial_req(s_video_call_params.call_type, s_video_call_params.number, s_video_call_ticket);
+ if(0 > ret)
+ {
+ mmi_vc_call_dialing_timeout_cb(NULL);
+ }
+}
+
+void mmi_vc_call_action_dialing(char * number, MODEM_VIDEO_CALL_TYPE type)
+{
+ // check call state
+ if(MMI_VIDEO_CALL_STATE_NONE != s_video_call_params.state)
+ {
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, s_video_call_params.state);
+ return;
+ }
+
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__, number, type);
+
+ // stop timer
+ mmi_vc_ring_off_timer_stop();
+ mmi_vc_dialing_timer_stop();
+
+ Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+ s_video_call_params.state = MMI_VIDEO_CALL_STATE_DIALING;
+ s_video_call_params.call_type = type;
+ strcpy(s_video_call_params.number, number);
+ 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_NO_SIM_OR_NETWORK); // WATCH_TEXT_ID_NO_CONTACTS_OR_NETWORK);
+ lv_obj_align(label, cont, LV_ALIGN_CENTER, 0, 0);
+
+ fail_timer_id = Hal_Timer_Start(2*1000, mmi_vc_call_fail_timeout_cb, NULL, FALSE);
+}
+
+static void mmi_vc_voice_btn_action(lv_obj_t * btn, lv_event_t e)
+{
+ if(LV_EVENT_CLICKED != e)
+ {
+ return;
+ }
+
+ if(true == mmi_vc_check_mo_permission())
+ {
+ uint8_t index = lv_watch_get_free_num(btn);
+
+ mmi_vc_call_action_dialing(s_vc_contact.number[index], MODEM_VIDEO_CALL_TYPE_VOICE);
+ }
+ else
+ {
+ mmi_vc_call_action_no_permission();
+ }
+}
+
+static void mmi_vc_video_btn_action(lv_obj_t * btn, lv_event_t e)
+{
+ if(LV_EVENT_CLICKED != e)
+ {
+ return;
+ }
+
+ if(true == mmi_vc_check_mo_permission())
+ {
+ uint8_t index = lv_watch_get_free_num(btn);
+
+ mmi_vc_call_action_dialing(s_vc_contact.number[index], MODEM_VIDEO_CALL_TYPE_VIDEO);
+ }
+ else
+ {
+ mmi_vc_call_action_no_permission();
+ }
+}
+
+static void mmi_vc_dial_btn_screen(lv_obj_t * btn, lv_event_t e)
+{
+ if(LV_EVENT_CLICKED != e)
+ {
+ return;
+ }
+
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_obj_t * obj = lv_watch_get_activity_obj(ACT_ID_VOIP_PHONEBOOK);
+ uint8_t index = lv_watch_get_free_num(btn);
+
+ lv_obj_t * cont = lv_cont_create(obj, NULL);
+ lv_cont_set_fit(cont, LV_FIT_NONE);
+ lv_obj_set_size(cont, LV_HOR_RES, LV_VER_RES); // lv_obj_get_width(obj), lv_obj_get_height(obj));
+ lv_obj_set_style_local_bg_color(cont, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+ lv_cont_set_layout(cont, LV_LAYOUT_OFF);
+ lv_obj_set_click(cont, false);
+
+ lv_obj_t * voicebtn = lv_imgbtn_create(cont, NULL);
+ lv_imgbtn_set_src(voicebtn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VOICE_BTN);
+ lv_imgbtn_set_src(voicebtn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VOICE_BTN);
+ lv_obj_align(voicebtn, cont, LV_ALIGN_IN_TOP_MID, 0, 10);
+ lv_obj_set_event_cb(voicebtn, mmi_vc_voice_btn_action);
+ lv_watch_set_free_num(voicebtn, index);
+
+ lv_obj_t * videobtn = lv_imgbtn_create(cont, NULL);
+ lv_imgbtn_set_src(videobtn, LV_BTN_STATE_RELEASED, ICON_VIDEO_CALL_VIDEO_BTN);
+ lv_imgbtn_set_src(videobtn, LV_BTN_STATE_PRESSED, ICON_VIDEO_CALL_VIDEO_BTN);
+ lv_obj_align(videobtn, cont, LV_ALIGN_IN_BOTTOM_MID, 0, -10);
+ lv_obj_set_event_cb(videobtn, mmi_vc_video_btn_action);
+ lv_watch_set_free_num(videobtn, index);
+}
+
+static lv_obj_t * mmi_vc_contact_list_create(lv_obj_t * obj)
+{
+ /*Allocate the object type specific extended data*/
+ lv_vc_contact_list_obj_ext_t * ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_vc_contact_list_obj_ext_t));
+ /*ext realloc based on watch_obj_ext, do not memeset it*/
+ if(NULL == ext)
+ {
+ return NULL;
+ }
+
+ ext->title = NULL;
+ ext->list = NULL;
+
+ /* content */
+ lv_obj_t * content = lv_cont_create(obj, NULL);
+ lv_cont_set_fit(content, LV_FIT_NONE);
+ lv_obj_set_size(content, lv_obj_get_width(obj), lv_obj_get_height(obj));
+ lv_obj_add_style(content,LV_OBJ_PART_MAIN, &lv_watch_style_transp);
+ lv_obj_set_style_local_bg_color(content, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+ lv_cont_set_layout(content, LV_LAYOUT_OFF); // lv_cont_set_layout(content, LV_LAYOUT_COLUMN_MID);
+ lv_obj_set_click(content, false);
+ lv_obj_align(content, obj, LV_ALIGN_CENTER, 0, 0);
+
+ lv_obj_t * label = lv_label_create(content, NULL);
+ lv_obj_set_size(label, LV_HOR_RES, 40); // 30);
+ lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font20_gray);
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_label_set_text_id(label, WATCH_TEXT_ID_VIDEOCALL);
+ lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 5);
+ lv_obj_set_click(label, false);
+ ext->title = label;
+
+ lv_obj_t * list = lv_list_create(content, NULL);
+ if(list == NULL)
+ {
+ return NULL;
+ }
+ lv_watch_obj_add_element(list);
+ lv_watch_obj_add_element(lv_page_get_scrl(list));
+ lv_obj_add_style(list, LV_LIST_PART_BG, &lv_watch_style_transp);
+ //lv_obj_add_style(list, LV_LIST_PART_SCROLLABLE, &lv_watch_style_transp);
+ //lv_obj_set_style_local_pad_top(list, LV_LIST_PART_SCROLLABLE, LV_STATE_DEFAULT, 4);
+ //lv_obj_set_style_local_pad_bottom(list, LV_LIST_PART_SCROLLABLE, LV_STATE_DEFAULT, 4);
+ lv_list_set_scrollbar_mode(list, LV_SCROLLBAR_MODE_OFF);
+ lv_page_set_scrollbar_mode(list, LV_SCROLLBAR_MODE_OFF);
+ lv_obj_set_width(list, lv_obj_get_width(content));
+ lv_coord_t height = lv_obj_get_height(content) - 40; // lv_obj_get_height(label);
+ lv_obj_set_height(list, height);
+ lv_obj_align(list, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
+ lv_obj_set_click(list, false);
+ ext->list = list;
+
+ int8_t i = 0;
+ lv_obj_t * btn;
+
+ for(i = 0; i < s_vc_contact.total; i++)
+ {
+ char t_str[NV_WATCH_VC_CONTACT_NUMBER_LEN] = {0};
+
+ if(0 < strlen(s_vc_contact.name[i]))
+ strcpy(t_str, s_vc_contact.name[i]);
+ else
+ strcpy(t_str, s_vc_contact.number[i]);
+
+ #if 0
+ btn = lv_list_add_btn(list, NULL, t_str);
+ lv_page_glue_obj(btn, true);
+ //lv_obj_add_protect(btn, LV_PROTECT_PRESS_LOST);
+ lv_obj_set_event_cb(btn, mmi_vc_dial_btn_screen);
+ lv_watch_obj_add_element(btn);
+
+ lv_obj_set_style_local_bg_color(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+ lv_obj_set_style_local_pad_top(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 6);
+ lv_obj_set_style_local_pad_bottom(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 6);
+ lv_obj_set_style_local_pad_left(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 15);
+ lv_obj_set_style_local_pad_right(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 15);
+ lv_obj_set_style_local_pad_inner(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 10);
+
+ //lv_obj_set_size(btn, lv_obj_get_width(list), 80); //56);
+
+ //label = lv_obj_get_child(btn, NULL);
+ //label = lv_list_get_btn_label(btn);
+ //lv_label_set_long_mode(label, LV_LABEL_LONG_EXPAND);
+ //lv_label_set_text(label, t_str);
+ //lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+ //lv_obj_align(label, btn, LV_ALIGN_IN_LEFT_MID, 0, 0);
+ #else
+
+ btn = lv_list_add_btn(list, NULL, NULL);
+ //lv_page_glue_obj(btn, true);
+ //lv_obj_add_protect(btn, LV_PROTECT_PRESS_LOST);
+ lv_obj_set_event_cb(btn, mmi_vc_dial_btn_screen);
+ lv_watch_obj_add_element(btn);
+
+ lv_obj_set_style_local_bg_color(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+ lv_obj_set_style_local_pad_top(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 5);
+ lv_obj_set_style_local_pad_bottom(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 5);
+ lv_obj_set_style_local_pad_left(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 15);
+ lv_obj_set_style_local_pad_right(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 15);
+ lv_obj_set_style_local_pad_inner(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 10);
+
+ //label = lv_obj_get_child(btn, NULL);
+ //label = lv_list_get_btn_label(btn);
+ label = lv_label_create(btn, NULL);
+ //lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL); // LV_LABEL_LONG_SROLL_CIRC
+ lv_obj_set_width(label, lv_obj_get_width(btn));
+ lv_label_set_text(label, t_str);
+ lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+ lv_label_set_align(label, LV_LABEL_ALIGN_LEFT);
+ lv_obj_set_click(label, false);
+ //lv_obj_align(label, btn, LV_ALIGN_IN_LEFT_MID, 0, 0);
+ #endif
+
+ lv_watch_set_free_num(btn, i);
+ }
+
+ return obj;
+}
+
+static lv_obj_t * mmi_vc_main_create(lv_obj_t * activity_obj)
+{
+ if(activity_obj == NULL)
+ {
+ lv_watch_activity_ext_t activity_ext = {0};
+
+ activity_ext.actId = ACT_ID_VOIP_PHONEBOOK;
+ activity_ext.create = mmi_vc_main_create;
+ activity_ext.prepare_destory = mmi_vc_main_prepare_destory;
+ activity_obj = lv_watch_creat_activity_obj(&activity_ext);
+ if(NULL == activity_obj)
+ return NULL;
+ }
+
+ lv_obj_t * obj = lv_watch_obj_create(activity_obj);
+ if(NULL == obj)
+ return NULL;
+
+ if(false == mmi_vc_check_mo_permission())
+ {
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_obj_t * label = lv_label_create(obj, NULL);
+ lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_obj_set_click(label, false);
+ lv_label_set_text_id(label, WATCH_TEXT_ID_NO_SIM_OR_NETWORK); // WATCH_TEXT_ID_NO_CONTACTS_OR_NETWORK);
+ lv_obj_align(label, obj, LV_ALIGN_CENTER, 0, -10);
+ }
+ else if(0 == s_vc_contact.total)
+ {
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_obj_t * label = lv_label_create(obj, NULL);
+ lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_watch_font26);
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_obj_set_click(label, false);
+ lv_label_set_text_id(label, WATCH_TEXT_ID_NO_CONTACTS);
+ lv_obj_align(label, obj, LV_ALIGN_CENTER, 0, -10);
+ }
+ else
+ {
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ mmi_vc_contact_list_create(obj);
+ }
+
+ return(obj);
+}
+
+void video_call_create_event_cb(lv_obj_t * btn, lv_event_t e)
+{
+#ifdef __VIDEO_CALL_TEST__
+ nv_watch_vc_contact_t t_test_contact =
+ {
+ 3,
+ {"test001", "test002", "test003"},
+ {"jrtc001", "jrtc002", "jrtc003"}
+ };
+
+ _lv_memcpy(&s_vc_contact, &t_test_contact, sizeof(nv_watch_vc_contact_t));
+#endif
+
+ if(LV_EVENT_CLICKED == e)
+ {
+ lv_watch_png_cache_all_free();
+ mmi_vc_main_create(NULL);
+ }
+ else if(LV_EVENT_LONG_PRESSED == e)
+ {
+
+ }
+}
+
+
+//interface
+uint8_t mmi_vc_get_call_volume_fzd(void)
+{
+ return(s_video_call_params.speaker_volume);
+}
+
+bool mmi_vc_watch_suspend_check_fzd(void)
+{
+ if((s_video_call_params.call_type == MODEM_VIDEO_CALL_TYPE_VIDEO)
+ || (MMI_VIDEO_CALL_STATE_INCOMING == s_video_call_params.state)
+ || (MMI_VIDEO_CALL_STATE_DIALING == s_video_call_params.state)
+ || (MMI_VIDEO_CALL_STATE_CONNECTING == s_video_call_params.state)
+ )
+ {
+ return false;
+ }
+
+ return true;
+}
+
+bool mmi_vc_connect_check_req_fzd(void)
+{
+ if(mmi_vc_call_get_activity_obj())
+ {
+ return true;
+ }
+
+ return false;
+}
+
+void mmi_vc_activity_destroy_req_fzd(void)
+{
+ VIDEO_CALL_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_obj_t * activity_obj = mmi_vc_call_get_activity_obj();
+ if(NULL == activity_obj)
+ {
+ return;
+ }
+
+ switch(s_video_call_params.state)
+ {
+ case MMI_VIDEO_CALL_STATE_NONE:
+ case MMI_VIDEO_CALL_STATE_INVALID:
+ // do noting
+ break;
+
+ case MMI_VIDEO_CALL_STATE_CALLING:
+ mmi_video_call_hangup_req(FALSE);
+ break;
+
+ case MMI_VIDEO_CALL_STATE_INCOMING:
+ Hal_Tone_Play_End();
+ mmi_video_call_reject_req(FALSE);
+ break;
+
+ default:
+ mmi_video_call_hangup_req(FALSE);
+ break;
+ }
+
+ voip_signal_check_stop();
+ voip_rat_check_stop();
+
+ // stop timer
+ mmi_vc_ring_off_timer_stop();
+ mmi_vc_dialing_timer_stop();
+ mmi_vc_connecting_timer_stop();
+
+ Hal_Mem_Set(&s_video_call_params, 0x0, sizeof(MMI_VIDEO_CALL_PARAMS_T));
+ voip_set_volume_when_slider_act();
+ mmi_vc_call_screen_clean();
+ lv_watch_png_cache_all_free();
+}
+
+#endif
+#endif
+
+