--- /dev/null
+
+
+
+#include "lv_watch.h"
+
+#ifdef __MMI_CUSTOM_BEI_KE_RUI_SHENG__
+
+#define AI_TALK_AUDIO_FORMAT_TYPE (7) // 3-amr
+#define AI_TALK_AUDIO_FORMAT_STR (".wav") // ".amr"
+
+static lv_signal_cb_t ancient_scrl_signal;
+
+static uint8_t s_ai_talk_init_flag = 0;
+static nv_watch_wechat_msg_info_t * s_ai_talk_info = NULL;
+static nv_watch_wechat_msg_item_info_t s_ai_talk_item_info = {0};
+static uint8_t s_ai_talk_play_anim_count = 0;
+static char s_ai_talk_selected_item_index = -1;
+static bool s_item_receive_playing = false;
+static uint32_t s_ai_talk_recording_sent_size = 0;
+
+
+void mmi_ai_talk_info_init(void)
+{
+ if(NULL == s_ai_talk_info)
+ {
+ uint32_t nv_data_length = sizeof(nv_watch_wechat_msg_info_t);
+
+ s_ai_talk_info = (nv_watch_wechat_msg_info_t *)lv_mem_alloc(nv_data_length);
+ if(NULL == s_ai_talk_info)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: memory alloc fail\n", __FUNCTION__, __LINE__);
+ return;
+ }
+ _lv_memset_00(s_ai_talk_info, nv_data_length);
+ }
+ else
+ {
+ //mmi_ai_talk_info_all_item_delete();
+ }
+}
+
+uint8_t mmi_ai_talk_info_count_get(void)
+{
+ uint8_t msg_count = s_ai_talk_info->msg_count;
+
+ return msg_count;
+}
+
+uint8_t mmi_ai_talk_info_index_item_msg_from_get(uint8_t msg_index)
+{
+ // 0-slef; 1-other
+ uint8_t msg_from = s_ai_talk_info->msg_item[msg_index].msg_from;
+
+ return msg_from;
+}
+
+void mmi_ai_talk_info_index_item_get(uint8_t msg_index, nv_watch_wechat_msg_item_info_t ** msg_item)
+{
+ *msg_item = &(s_ai_talk_info->msg_item[msg_index]);
+}
+
+void mmi_ai_talk_info_index_item_delete(uint8_t msg_index)
+{
+ if(msg_index >= s_ai_talk_info->msg_count)
+ return;
+
+ uint8_t i = 0;
+ uint32_t msg_item_info_size = sizeof(nv_watch_wechat_msg_item_info_t);
+
+ lv_fs_remove(s_ai_talk_info->msg_item[msg_index].msg_data_full_file_name);
+ _lv_memset_00(&(s_ai_talk_info->msg_item[msg_index]), msg_item_info_size);
+
+ if(msg_index < s_ai_talk_info->msg_count - 1)
+ {
+ for(i = msg_index; i < s_ai_talk_info->msg_count; i++)
+ {
+ _lv_memcpy(&(s_ai_talk_info->msg_item[i]), &(s_ai_talk_info->msg_item[i + 1]), msg_item_info_size);
+ }
+ }
+ s_ai_talk_info->msg_count--;
+}
+
+void mmi_ai_talk_info_all_item_delete(void)
+{
+ uint8_t i = 0;
+ uint32_t msg_item_info_size = sizeof(nv_watch_wechat_msg_item_info_t);
+
+ for(i = 0; i < s_ai_talk_info->msg_count; i++)
+ {
+ lv_fs_remove(s_ai_talk_info->msg_item[i].msg_data_full_file_name);
+ _lv_memset_00(&(s_ai_talk_info->msg_item[i]), msg_item_info_size);
+ }
+ s_ai_talk_info->msg_count = 0;
+}
+
+void mmi_ai_talk_info_new_item_add(nv_watch_wechat_msg_item_info_t * msg_item)
+{
+ uint32_t msg_item_info_size = sizeof(nv_watch_wechat_msg_item_info_t);
+
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ if(NV_WATCH_WECHAT_NUM_MAX <= s_ai_talk_info->msg_count)
+ {
+ lv_fs_remove(s_ai_talk_info->msg_item[0].msg_data_full_file_name);
+ //_lv_memset_00(&(s_ai_talk_info->msg_item[0]), msg_item_info_size);
+
+ uint8_t i = 0;
+ for(i = 0; i < NV_WATCH_WECHAT_NUM_MAX - 1; i++)
+ {
+ _lv_memcpy(&(s_ai_talk_info->msg_item[i]), &(s_ai_talk_info->msg_item[i + 1]), msg_item_info_size);
+ }
+ s_ai_talk_info->msg_count--;
+ }
+
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ s_ai_talk_info->msg_count++;
+ _lv_memcpy(&(s_ai_talk_info->msg_item[s_ai_talk_info->msg_count - 1]), msg_item, msg_item_info_size);
+}
+
+void * mmi_ai_talk_actId_ext_get(lv_watch_Activity_Id_t actId)
+{
+ lv_obj_t * activity_obj = lv_watch_get_activity_obj(actId);
+ 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 lv_obj_t * mmi_ai_talk_main_get_obj(void)
+{
+ lv_obj_t * watch_obj = NULL;
+
+ lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_AI_TALK);
+ if(NULL != activity_obj)
+ {
+ lv_watch_get_child_obj(activity_obj, lv_watch_obj_signal, &watch_obj);
+ }
+
+ return watch_obj;
+}
+
+void mmi_ai_talk_prepare_destory(lv_obj_t * activity_obj)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_watch_png_cache_all_free();
+
+ lv_ai_talk_ext_t * ext = mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK);
+ if(NULL == ext)
+ return ;
+
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ if(NULL != ext->delete_timer_id)
+ {
+ Hal_Timer_Stop(ext->delete_timer_id);
+ ext->delete_timer_id = NULL;
+ }
+
+ mmi_ai_talk_voice_item_playing_stop(ext);
+ mmi_ai_talk_list_msg_item_style_reset(ext);
+
+ //
+ Hal_NFFS_File_Play_End();
+ Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5);
+ Hal_Vibrator_Play_End();
+ s_item_receive_playing = false;
+
+ mmi_ai_talk_tcp_disconnect_msg(NULL);
+
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+}
+
+static void mmi_ai_talk_list_set_slide_enable(lv_watch_obj_ext_t * ext, bool enable)
+{
+ if(enable)
+ {
+ ext->slide_enable = 1; /*enable to slide to the right*/
+ }
+ else
+ {
+ ext->slide_enable = 0; /*disable to slide to the right*/
+ }
+}
+
+bool mmi_ai_talk_voice_is_playing(void)
+{
+ bool result = false;
+
+ lv_ai_talk_ext_t * ext = mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK);
+ if(NULL != ext && NULL != ext->list)
+ {
+ lv_ai_talk_list_ext_t * list_page_ext = lv_obj_get_ext_attr(ext->list);
+ if(NULL != list_page_ext->voice_playing_anim.var)
+ {
+ result = true;
+ }
+ }
+
+ return result;
+}
+
+bool mmi_ai_talk_voice_is_recording(void)
+{
+ bool result = false;
+
+ if(lv_watch_get_activity_obj(ACT_ID_AI_TALK_RECORDING))
+ {
+ result = true;
+ }
+
+ return result;
+}
+
+bool mmi_ai_talk_item_is_sending(void)
+{
+ bool result = false;
+
+ if(lv_watch_get_activity_obj(ACT_ID_AI_TALK_SENDING))
+ {
+ result = true;
+ }
+
+ return result;
+}
+
+void mmi_ai_talk_receive_audio_play_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: priority=%d\n", __FUNCTION__, __LINE__, priority);
+
+ if(AUDIO_CTRL_PRIORITY_5 == priority)
+ {
+
+ }
+ else if(AUDIO_CTRL_PRIORITY_5 > priority)
+ {
+ Hal_NFFS_File_Play_End();
+ Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5);
+ Hal_Vibrator_Play_End();
+ s_item_receive_playing = false;
+ }
+}
+
+void mmi_ai_talk_receive_audio_play_over_cb(void *para)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ Hal_NFFS_File_Play_End();
+ Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5);
+ Hal_Vibrator_Play_End();
+ s_item_receive_playing = false;
+}
+
+static bool mmi_ai_talk_item_info_write_to_file(char * file_path, char * file_buf, uint32_t file_size)
+{
+ lv_fs_file_t file_p;
+ lv_fs_res_t res;
+ uint32_t bytes_write = 0;
+
+ res = lv_fs_open(&file_p, file_path, LV_FS_MODE_WR);
+ if(LV_FS_RES_OK != res)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
+ lv_fs_close(&file_p);
+ return false;
+ }
+ res = lv_fs_write(&file_p, file_buf, file_size, &bytes_write);
+ lv_fs_close(&file_p);
+ if(LV_FS_RES_OK != res)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
+ return false;
+ }
+ printf("[@CHENG_DEBUG][%s][%d]: file_size=%d,write_size=%d\n", __FUNCTION__, __LINE__, file_size, bytes_write);
+
+ return true;
+}
+
+void mmi_ai_talk_receive_update_ui(void)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ if(AUDIO_CTRL_PRIORITY_5 == Hal_Audio_Manage_Start_Req(AUDIO_CTRL_PRIORITY_5, mmi_ai_talk_receive_audio_play_audio_ctrl_callback))
+ {
+ if(false == s_item_receive_playing)
+ {
+ s_item_receive_playing = true;
+
+ //Hal_NFFS_File_Play_Onetime(AUDIO_WECHAT_RECEIVE, (HAL_SPEAKER_GAIN)query_current_volume(), mmi_ai_talk_receive_audio_play_over_cb, NULL);
+ //Hal_Vibrator_Play_Onetime(NULL, 1000);
+ }
+
+ if(lv_watch_get_activity_obj(ACT_ID_AI_TALK))
+ {
+ mmi_ai_talk_main_screen_refresh();
+ }
+ else
+ {
+ //mmi_ai_talk_create_event_cb(NULL, LV_EVENT_CLICKED);
+ }
+ }
+}
+
+bool mmi_ai_talk_receive_from_server(char * data_buff, int data_buff_len, nv_wechat_msg_type_e type)
+{
+ if(NULL == data_buff || 0 == data_buff_len)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ return false;
+ }
+ if(WECHAT_MSG_TYPE_MAX <= type)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ return false;
+ }
+
+ nv_watch_wechat_msg_item_info_t mmi_ai_talk_item_info = {0};
+ hal_rtc_t cur_time = {0};
+ char * t_file_ext[WECHAT_MSG_TYPE_MAX] = {AI_TALK_AUDIO_FORMAT_STR, "txt", "png", "png"}; // match nv_wechat_msg_type_e
+
+ Hal_Rtc_Gettime(&cur_time);
+ _lv_memcpy(&(s_ai_talk_item_info.msg_time), &cur_time, sizeof(hal_rtc_t));
+
+ s_ai_talk_item_info.msg_from = 1;
+ s_ai_talk_item_info.unread_flag = 1;
+ s_ai_talk_item_info.msg_type = type; // WECHAT_MSG_TYPE_VOICE;
+ s_ai_talk_item_info.msg_data_size = data_buff_len;
+ sprintf(s_ai_talk_item_info.msg_data_full_file_name, "C:/wechat_r%04d%02d%02d_%02d%02d%02d.%s", /*WECHAT_MSG_DATA_FILE_PATH, */
+ s_ai_talk_item_info.msg_time.tm_year,
+ s_ai_talk_item_info.msg_time.tm_mon,
+ s_ai_talk_item_info.msg_time.tm_mday,
+ s_ai_talk_item_info.msg_time.tm_hour,
+ s_ai_talk_item_info.msg_time.tm_min,
+ s_ai_talk_item_info.msg_time.tm_sec,
+ t_file_ext[type]);
+
+ if(false == mmi_ai_talk_item_info_write_to_file(s_ai_talk_item_info.msg_data_full_file_name, data_buff, data_buff_len))
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ return false;
+ }
+
+// lv_ai_talk_ext_t * ext = mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK);
+// if(NULL != ext)
+// {
+// mmi_ai_talk_voice_item_playing_stop(ext);
+// }
+
+ mmi_ai_talk_info_new_item_add(&s_ai_talk_item_info);
+
+ // ui
+ if(false == mmi_active_screen_is_prohibit_interrupted()
+ && false == mmi_health_measure_state_is_ui_measure()
+// && false == mmi_ai_talk_voice_is_playing()
+ && false == mmi_ai_talk_voice_is_recording()
+ && false == mmi_ai_talk_item_is_sending()
+ #ifdef __MMI_ZHSX_SUPPORT_DO_NOT_DISTURB__
+ && false == mmi_watch_is_in_do_not_disturb_time()
+ #endif
+ )
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ mmi_watch_wake_up();
+ mmi_ui_msg_action_ai_talk_incoming();
+ }
+
+ return true;
+}
+
+bool mmi_ai_talk_send_to_server(void)
+{
+ bool result = false; // true-success; false-fail
+
+ lv_ai_talk_ext_t * ext = (lv_ai_talk_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK);
+ if(NULL == ext)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ return false;
+ }
+
+#if 20
+
+ printf("[@CHENG_DEBUG][%s][%d]: size=%d, buf=0x%x\n", __FUNCTION__, __LINE__, ext->record_size, ext->record_buffer);
+
+ uint32_t file_size = ext->record_size - s_ai_talk_recording_sent_size;
+ if(0 >= file_size)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ return false;
+ }
+ char * file_buf = lv_mem_alloc(file_size + 1);
+ if(NULL == file_buf)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_mem_free(ext->record_buffer);
+ ext->record_buffer = NULL;
+ ext->record_size = 0;
+ return false;
+ }
+ _lv_memset_00(file_buf, file_size + 1);
+ _lv_memcpy(file_buf, ext->record_buffer + s_ai_talk_recording_sent_size, file_size);
+ lv_mem_free(ext->record_buffer);
+ ext->record_buffer = NULL;
+
+ if(true == mmi_ai_talk_audio_data_send(file_buf, file_size))
+ {
+ result = true;
+ }
+ lv_mem_free(file_buf);
+ s_ai_talk_recording_sent_size = 0;
+
+#else
+
+#if 10
+ printf("[@CHENG_DEBUG][%s][%d]: size=%d, buf=0x%x\n", __FUNCTION__, __LINE__, ext->record_size, ext->record_buffer);
+
+ uint32_t file_size = ext->record_size;
+ char * file_buf = lv_mem_alloc(file_size + 1);
+ if(NULL == file_buf || MMI_AI_TALK_DATA_WAV_HEAD_SIZE >= file_size)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_mem_free(ext->record_buffer);
+ ext->record_buffer = NULL;
+ ext->record_size = 0;
+ return false;
+ }
+ _lv_memset_00(file_buf, file_size + 1);
+ _lv_memcpy(file_buf, ext->record_buffer, file_size);
+
+ lv_mem_free(ext->record_buffer);
+ ext->record_buffer = NULL;
+
+#else
+
+ lv_mem_free(ext->record_buffer);
+ ext->record_buffer = NULL;
+
+
+ lv_fs_file_t file_p;
+ lv_fs_res_t res;
+ uint32_t file_size = 0, bytes_read = 0;
+ char * file_buf = NULL;
+
+ res = lv_fs_open(&file_p, "C:/111.pcm", LV_FS_MODE_RD);
+ if(LV_FS_RES_OK != res)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
+ lv_fs_close(&file_p);
+ return false;
+ }
+
+ lv_fs_size(&file_p, &file_size);
+ file_buf = (char *)lv_mem_alloc(file_size + 1);
+ _lv_memset_00(file_buf, file_size + 1);
+ res = lv_fs_read(&file_p, file_buf, file_size, &bytes_read);
+ lv_fs_close(&file_p);
+ if(LV_FS_RES_OK != res)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
+ lv_mem_free(file_buf);
+ return false;
+ }
+ printf("[@CHENG_DEBUG][%s][%d]: %d,%d,%s\n", __FUNCTION__, __LINE__, file_size, bytes_read, file_buf);
+
+#endif
+
+
+
+ if(true == mmi_ai_talk_item_info_write_to_file(s_ai_talk_item_info.msg_data_full_file_name, file_buf, file_size))
+ {
+ if(true == mmi_ai_talk_audio_data_send(file_buf, file_size))
+ {
+ s_ai_talk_item_info.msg_data_size = file_size;
+ mmi_ai_talk_info_new_item_add(&s_ai_talk_item_info);
+ result = true;
+ }
+ else
+ {
+ lv_fs_remove(s_ai_talk_item_info.msg_data_full_file_name);
+ }
+ }
+
+ lv_mem_free(file_buf);
+ _lv_memset_00(&s_ai_talk_item_info, sizeof(nv_watch_wechat_msg_item_info_t));
+#endif
+
+ return result;
+}
+
+void mmi_ai_talk_item_delete_success_timer_cb(void *para)
+{
+ //lv_ai_talk_ext_t * ext = (lv_ai_talk_ext_t *)para;
+
+ mmi_ai_talk_main_screen_refresh();
+}
+
+void mmi_ai_talk_item_delete_ok_btn_event_cb(lv_obj_t * obj, lv_event_t e)
+{
+ if(LV_EVENT_CLICKED == e)
+ {
+ lv_ai_talk_ext_t * ext = (lv_ai_talk_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK);
+ if(NULL != ext && NULL != ext->delete_bg)
+ {
+ uint32_t value = lv_watch_get_free_num(obj);
+ if(0 == value)
+ mmi_ai_talk_info_index_item_delete(s_ai_talk_selected_item_index);
+ else if(1 == value)
+ mmi_ai_talk_info_all_item_delete();
+
+ lv_obj_clean(ext->delete_bg);
+
+ lv_obj_t * label_prompt = lv_label_create(ext->delete_bg, NULL);
+ lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &lv_watch_font26_black);
+ lv_label_set_text_id(label_prompt, WATCH_TEXT_ID_DEL_SUCCESS);
+ lv_obj_align(label_prompt, ext->delete_bg, LV_ALIGN_CENTER, 0, -10);
+
+ //ext->delete_timer_id = Hal_Timer_Start(1500, mmi_ai_talk_item_delete_success_timer_cb, ext, false);
+ ext->delete_timer_id = Hal_Timer_Start(1500, mmi_ai_talk_item_delete_success_timer_cb, NULL, false);
+ }
+ }
+}
+
+void mmi_ai_talk_item_delete_cancel_btn_event_cb(lv_obj_t * obj, lv_event_t e)
+{
+ if(LV_EVENT_CLICKED == e)
+ {
+ lv_ai_talk_ext_t * ext = (lv_ai_talk_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK);
+ if(NULL != ext && NULL != ext->delete_bg)
+ {
+ lv_obj_del(ext->delete_bg);
+ ext->delete_bg = NULL;
+ }
+ }
+}
+
+void mmi_ai_talk_item_delete_select_btn_event_cb(lv_obj_t * obj, lv_event_t e)
+{
+ if(LV_EVENT_CLICKED != e)
+ {
+ return;
+ }
+
+ lv_ai_talk_ext_t * ext = (lv_ai_talk_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK);
+ if(NULL != ext)
+ {
+ uint32_t value = lv_watch_get_free_num(obj);
+
+ lv_obj_set_hidden(ext->delete_current, true);
+ lv_obj_set_hidden(ext->delete_all, true);
+ lv_obj_set_hidden(ext->delete_back, true);
+
+ lv_obj_set_hidden(ext->delete_label_prompt, false);
+ lv_obj_set_hidden(ext->delete_btn_cancel, false);
+ lv_obj_set_hidden(ext->delete_btn_ok, false);
+ lv_watch_set_free_num(ext->delete_btn_ok, value);
+ }
+}
+
+void mmi_ai_talk_list_msg_item_delete_create(void)
+{
+ lv_ai_talk_ext_t * ext = (lv_ai_talk_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK);
+ if(NULL != ext && NULL != ext->cont)
+ {
+ ext->delete_bg = lv_cont_create(ext->cont, NULL);
+ lv_obj_set_size(ext->delete_bg, LV_HOR_RES, LV_VER_RES);
+ lv_obj_set_style_local_bg_color(ext->delete_bg, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, lv_color_make(0xB6, 0xF7, 0xFF));
+
+ // current
+ lv_obj_t * btn_delete_current = lv_cont_create(ext->delete_bg, NULL);
+ lv_obj_set_size(btn_delete_current, LV_HOR_RES - 40, 56);
+ lv_obj_set_style_local_bg_color(btn_delete_current, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_MAKE(0xB9, 0x86, 0xFF));
+ lv_obj_set_style_local_radius(btn_delete_current, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, 10);
+ lv_obj_set_click(btn_delete_current, true);
+ lv_obj_set_event_cb(btn_delete_current, mmi_ai_talk_item_delete_select_btn_event_cb);
+ lv_obj_align(btn_delete_current, NULL, LV_ALIGN_IN_TOP_MID, 0, 40);
+ lv_watch_set_free_num(btn_delete_current, 0);
+ ext->delete_current = btn_delete_current;
+
+ lv_obj_t * label_delete_current = lv_label_create(btn_delete_current, NULL);
+ lv_obj_add_style(label_delete_current, LV_LABEL_PART_MAIN, &lv_watch_font26);
+ lv_label_set_text_id(label_delete_current, WATCH_TEXT_ID_DELETE_CURRENT_ITEM);
+ lv_label_set_align(label_delete_current, LV_LABEL_ALIGN_CENTER);
+ lv_obj_align(label_delete_current, btn_delete_current, LV_ALIGN_CENTER, 0, 0);
+
+ // all
+ lv_obj_t * btn_delete_all = lv_cont_create(ext->delete_bg, btn_delete_current);
+ lv_obj_set_style_local_bg_color(btn_delete_all, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_MAKE(0xFF, 0x6F, 0x91));
+ lv_obj_align(btn_delete_all, btn_delete_current, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
+ lv_watch_set_free_num(btn_delete_all, 1);
+ ext->delete_all = btn_delete_all;
+
+ lv_obj_t * label_delete_all = lv_label_create(btn_delete_all, NULL);
+ lv_obj_add_style(label_delete_all, LV_LABEL_PART_MAIN, &lv_watch_font26);
+ lv_label_set_text_id(label_delete_all, WATCH_TEXT_ID_DELETE_ALL_ITEM);
+ lv_label_set_align(label_delete_all, LV_LABEL_ALIGN_CENTER);
+ lv_obj_align(label_delete_all, btn_delete_all, LV_ALIGN_CENTER, 0, 0);
+
+ // back
+ lv_obj_t * btn_delete_back = lv_cont_create(ext->delete_bg, btn_delete_current);
+ lv_obj_set_style_local_bg_color(btn_delete_back, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_MAKE(0x47, 0xA6, 0xFF));
+ lv_obj_set_event_cb(btn_delete_back, mmi_ai_talk_item_delete_cancel_btn_event_cb);
+ lv_obj_align(btn_delete_back, btn_delete_all, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
+ ext->delete_back = btn_delete_back;
+
+ lv_obj_t * label_delete_back = lv_label_create(btn_delete_back, NULL);
+ lv_obj_add_style(label_delete_back, LV_LABEL_PART_MAIN, &lv_watch_font26);
+ lv_label_set_text_id(label_delete_back, WATCH_TEXT_ID_CANCEL);
+ lv_label_set_align(label_delete_back, LV_LABEL_ALIGN_CENTER);
+ lv_obj_align(label_delete_back, btn_delete_back, LV_ALIGN_CENTER, 0, 0);
+
+
+ lv_obj_t * label_prompt = lv_label_create(ext->delete_bg, NULL);
+ lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &lv_watch_font26_black);
+ lv_label_set_text_id(label_prompt, WATCH_TEXT_ID_DEL_Q);
+ lv_obj_align(label_prompt, ext->delete_bg, LV_ALIGN_CENTER, 0, -30);
+ ext->delete_label_prompt = label_prompt;
+
+ lv_obj_t * btn_cancel = lv_btn_create(ext->delete_bg, NULL);
+ lv_obj_set_size(btn_cancel, 100, 56);
+ 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_align(btn_cancel, NULL, LV_ALIGN_IN_BOTTOM_LEFT, 10, -20);
+ lv_obj_set_event_cb(btn_cancel, mmi_ai_talk_item_delete_cancel_btn_event_cb);
+ ext->delete_btn_cancel = btn_cancel;
+
+ lv_obj_t * label_cancel = lv_label_create(btn_cancel, NULL);
+ lv_obj_add_style(label_cancel, LV_LABEL_PART_MAIN, &lv_watch_font26);
+ lv_label_set_text_id(label_cancel, WATCH_TEXT_ID_CANCEL);
+
+ lv_obj_t * btn_ok = lv_btn_create(ext->delete_bg, btn_cancel);
+ lv_obj_set_style_local_bg_color(btn_ok, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, lv_color_make(0xFF, 0x6F, 0x91));
+ lv_obj_set_style_local_bg_color(btn_ok, LV_BTN_PART_MAIN, LV_STATE_PRESSED, lv_color_make(0xFF, 0x6F, 0x91));
+ lv_obj_align(btn_ok, NULL, LV_ALIGN_IN_BOTTOM_RIGHT, -10, -20);
+ lv_obj_set_event_cb(btn_ok, mmi_ai_talk_item_delete_ok_btn_event_cb);
+ ext->delete_btn_ok = btn_ok;
+
+ lv_obj_t * label_ok = lv_label_create(btn_ok, label_cancel);
+ lv_label_set_text_id(label_ok, WATCH_TEXT_ID_OK);
+
+ // display
+ lv_obj_set_hidden(label_prompt, true);
+ lv_obj_set_hidden(btn_cancel, true);
+ lv_obj_set_hidden(btn_ok, true);
+ }
+}
+
+void mmi_ai_talk_sending_anim_cb(lv_anim_t * a)
+{
+ lv_obj_t * img = a->var;
+
+ switch(s_ai_talk_play_anim_count % 3)
+ {
+ case 0:
+ lv_img_set_src(img, ICON_WECHAT_SENDING_PROMPT1);
+ break;
+
+ case 1:
+ lv_img_set_src(img, ICON_WECHAT_SENDING_PROMPT2);
+ break;
+
+ case 2:
+ lv_img_set_src(img, ICON_WECHAT_SENDING_PROMPT3);
+ break;
+
+ default:
+ break;
+ }
+ s_ai_talk_play_anim_count++;
+}
+
+void mmi_ai_talk_sending_result_screen_timeout(void *para)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ mmi_ai_talk_sending_screen_prepare_destory(NULL);
+
+ //delete sending screen
+ //lv_watch_del_interface(ACT_ID_AI_TALK_SENDING);
+ lv_obj_t * obj = lv_watch_get_activity_obj(ACT_ID_AI_TALK_SENDING);
+ if(NULL != obj)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ lv_obj_del(obj);
+ }
+
+ //return main list screen
+ mmi_ai_talk_main_screen_refresh();
+}
+
+void mmi_ai_talk_sending_screen_timeout(void *para)
+{
+ lv_ai_talk_sending_ext_t * sending_ext = (lv_ai_talk_sending_ext_t *)para;
+
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ if(NULL != sending_ext->sending_timer_id)
+ {
+ Hal_Timer_Stop(sending_ext->sending_timer_id);
+ sending_ext->sending_timer_id = NULL;
+ }
+
+ if(NULL != sending_ext->sending_anim.var)
+ {
+ lv_obj_t * img_bkg = lv_obj_get_parent(sending_ext->sending_anim.var);
+ lv_img_set_src(img_bkg, ((true == sending_ext->send_result) ? ICON_WECHAT_SENDING_SUCC : ICON_WECHAT_SENDING_FAILED));
+
+ lv_anim_del(sending_ext->sending_anim.var, NULL);
+ lv_obj_del(sending_ext->sending_anim.var);
+ sending_ext->sending_anim.var = NULL;
+ }
+
+ sending_ext->result_timer_id = Hal_Timer_Start(1500, mmi_ai_talk_sending_result_screen_timeout, sending_ext, FALSE);
+}
+
+void mmi_ai_talk_sending_screen_prepare_destory(lv_obj_t * activity_obj)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ mmi_ai_talk_audio_data_send_end_char();
+
+ lv_watch_png_cache_all_free();
+
+ lv_ai_talk_sending_ext_t * sending_ext = (lv_ai_talk_sending_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK_SENDING);
+ if(NULL != sending_ext)
+ {
+ if(NULL != sending_ext->sending_timer_id)
+ {
+ Hal_Timer_Stop(sending_ext->sending_timer_id);
+ sending_ext->sending_timer_id = NULL;
+ }
+ if(NULL != sending_ext->result_timer_id)
+ {
+ Hal_Timer_Stop(sending_ext->result_timer_id);
+ sending_ext->result_timer_id = NULL;
+ }
+ }
+}
+
+lv_obj_t * mmi_ai_talk_sending_screen_create(lv_obj_t * activity_obj)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ if(NULL == activity_obj)
+ {
+ lv_watch_activity_ext_t activity_ext = {0};
+
+ activity_ext.actId = ACT_ID_AI_TALK_SENDING;
+ activity_ext.create = (lv_watch_activity_create_f_t)mmi_ai_talk_sending_screen_create;
+ activity_ext.prepare_destory = mmi_ai_talk_sending_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_ai_talk_sending_ext_t * sending_ext = (lv_ai_talk_sending_ext_t *)lv_obj_allocate_ext_attr(obj, sizeof(lv_ai_talk_sending_ext_t));
+ if(NULL == sending_ext)
+ return NULL;
+
+ mmi_ai_talk_list_set_slide_enable(&sending_ext->old_ext, false); /*prevent to slide out while recording*/
+ _lv_memset_00(&(sending_ext->sending_anim), sizeof(lv_anim_t));
+ sending_ext->send_result = mmi_ai_talk_send_to_server();
+ sending_ext->sending_timer_id = Hal_Timer_Start(1000 * 3, mmi_ai_talk_sending_screen_timeout, sending_ext, FALSE);
+ sending_ext->result_timer_id = NULL;
+
+ lv_obj_t * img_bkg = lv_img_create(obj, NULL);
+ lv_img_set_src(img_bkg, ICON_WECHAT_SENDING_BG);
+ lv_obj_align(img_bkg, obj, LV_ALIGN_CENTER, 0, 0);
+
+ lv_obj_t * img_sending = lv_img_create(img_bkg, NULL);
+ lv_img_set_src(img_sending, ICON_WECHAT_SENDING_PROMPT3);
+#if USE_LV_WATCH_UI_240_320
+ lv_obj_align(img_sending, img_bkg, LV_ALIGN_IN_BOTTOM_MID, 0, -20);
+#elif USE_LV_WATCH_UI_240_280
+ lv_obj_align(img_sending, img_bkg, LV_ALIGN_IN_BOTTOM_MID, 0, -40);
+#else
+ lv_obj_align(img_sending, img_bkg, LV_ALIGN_IN_BOTTOM_MID, 0, -20);
+#endif
+
+ lv_anim_t * a = &(sending_ext->sending_anim);
+ lv_anim_init(a);
+ lv_anim_set_var(a, img_sending);
+ //lv_anim_set_exec_cb(a, (lv_anim_exec_xcb_t)wechat_msg_sending_anim_exec_cb);
+ lv_anim_set_start_cb(a, (lv_anim_ready_cb_t)mmi_ai_talk_sending_anim_cb);
+ lv_anim_set_repeat_count(a, LV_ANIM_REPEAT_INFINITE);
+ lv_anim_set_repeat_delay(a, 500);
+ lv_anim_start(a);
+ s_ai_talk_play_anim_count = 0;
+
+ return obj;
+}
+
+void mmi_ai_talk_recording_release_event_cb(lv_obj_t * obj, lv_event_t e)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: event=%d\n", __FUNCTION__, __LINE__, e);
+
+#if 0
+ if(LV_EVENT_RELEASED == e) //(LV_EVENT_CLICKED == e)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_watch_del_interface(ACT_ID_AI_TALK_RECORDING);
+ mmi_ai_talk_sending_screen_create(NULL);
+ }
+#endif
+}
+
+void mmi_ai_talk_recording_anim(lv_anim_t * a)
+{
+ s_ai_talk_play_anim_count++;
+ if(0 == (s_ai_talk_play_anim_count % 4))
+ {
+ int8_t count_down = MMI_AI_TALK_DATA_RECORD_DURATION_MAX - s_ai_talk_play_anim_count / 4;
+ printf("[@CHENG_DEBUG][%s][%d]: count down=%d\n", __FUNCTION__, __LINE__, count_down);
+
+ if(0 < count_down)
+ {
+ lv_obj_t * label_time = a->var;
+ const char * content = lv_lang_get_text(WATCH_TEXT_ID_AUDIO_RECORDING); // WATCH_TEXT_ID_RELEASE_SENDING);
+ uint8_t len = strlen(content) + 8;
+ char * text = (char *)lv_mem_alloc(len);
+ snprintf(text, len, "%s %d", content, count_down);
+ lv_label_set_text(label_time, text);
+ lv_mem_free(text);
+ }
+ }
+}
+
+bool mmi_ai_talk_recording_stop(bool is_cancel)
+{
+ uint32_t duration_ms = 0;
+ uint32_t size = 0;
+
+ Hal_Record_Buffer_Stop_Req(&size, &duration_ms);
+ Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5);
+
+ lv_ai_talk_ext_t * ext = (lv_ai_talk_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK);
+ if(NULL == ext)
+ return false;
+
+ if(true == is_cancel)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ lv_mem_free(ext->record_buffer);
+ ext->record_buffer = NULL;
+ ext->record_size = 0;
+ return false;
+ }
+
+ if(MMI_AI_TALK_DATA_WAV_HEAD_SIZE >= size)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ lv_mem_free(ext->record_buffer);
+ ext->record_buffer = NULL;
+ ext->record_size = 0;
+ return false;
+ }
+ ext->record_size = size;
+
+ return true;
+}
+
+void mmi_ai_talk_recording_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: priority=%d\n", __FUNCTION__, __LINE__, priority);
+
+ if(AUDIO_CTRL_PRIORITY_5 == priority)
+ {
+ if(false == watch_is_ready())
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ return;
+ }
+ }
+ else if(AUDIO_CTRL_PRIORITY_5 > priority)
+ {
+ mmi_ai_talk_recording_stop(true);
+
+ //lv_watch_del_interface(ACT_ID_AI_TALK_RECORDING);
+ lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_AI_TALK_RECORDING);
+ if(NULL != activity_obj)
+ {
+ lv_obj_del(activity_obj);
+ }
+ }
+}
+
+void mmi_ai_talk_recording_task_cb(lv_task_t * task)
+{
+ lv_ai_talk_ext_t * ext = (lv_ai_talk_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK);
+ if(NULL == ext)
+ return ;
+
+ if(0 == ext->old_ext.element_click_en)
+ {
+ /*sliding to the right, not click button*/
+ return;
+ }
+
+ lv_obj_t * activity_obj;
+ MCI_EVNET_T event = (MCI_EVNET_T) (task->user_data);
+ printf("[@CHENG_DEBUG][%s][%d]: event=%d\n", __FUNCTION__, __LINE__, event);
+
+ switch(event)
+ {
+ case MCI_EVENT_EOS:
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ mmi_ai_talk_recording_stop(false);
+ activity_obj = lv_watch_get_activity_obj(ACT_ID_AI_TALK_RECORDING);
+ if(NULL != activity_obj)
+ {
+ lv_obj_del(activity_obj);
+ }
+ mmi_ai_talk_sending_screen_create(NULL);
+ break;
+
+ case MCI_EVENT_ERROR:
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ mmi_ai_talk_recording_stop(true);
+ activity_obj = lv_watch_get_activity_obj(ACT_ID_AI_TALK_RECORDING);
+ if(NULL != activity_obj)
+ {
+ lv_obj_del(activity_obj);
+ }
+ break;
+
+ //case MCI_EVENT_INFO:
+ // break;
+
+ default:
+ break;
+ }
+}
+
+void mmi_ai_talk_recording_cb(MCI_EVNET_T event, MCI_INFO_T info_type, int32_t value)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: event=%d,type=%d,value=%d\n", __FUNCTION__, __LINE__, event, info_type, value);
+
+ if(MCI_EVENT_INFO != event)
+ {
+ //recording_ext->event = event;
+ lv_task_t * record_task = lv_task_create(mmi_ai_talk_recording_task_cb, 10, LV_TASK_PRIO_HIGH, event);
+ lv_task_once(record_task);
+ }
+ else // MCI_EVENT_INFO == event
+ {
+ if(MCI_INFO_RECORDER_CUR_SIZE == info_type)
+ {
+ lv_ai_talk_ext_t * ext = (lv_ai_talk_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK);
+ if(NULL == ext)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ return;
+ }
+
+ uint32_t sending_size = value - s_ai_talk_recording_sent_size;
+ if(0 >= sending_size)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ return;
+ }
+
+ char * sending_buf = lv_mem_alloc(sending_size + 1);
+ if(NULL == sending_buf)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ return;
+ }
+ _lv_memset_00(sending_buf, sending_size + 1);
+ _lv_memcpy(sending_buf, ext->record_buffer + s_ai_talk_recording_sent_size, sending_size);
+
+ mmi_ai_talk_audio_data_send(sending_buf, sending_size);
+
+ lv_mem_free(sending_buf);
+ s_ai_talk_recording_sent_size += sending_size;
+ }
+ }
+}
+
+
+void mmi_ai_talk_recording_screen_prepare_destory(lv_obj_t * activity_obj)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_watch_png_cache_all_free();
+
+ //mmi_ai_talk_recording_stop(true);
+ uint32_t duration_ms = 0;
+ uint32_t size = 0;
+
+ Hal_Record_Buffer_Stop_Req(&size, &duration_ms);
+ Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5);
+}
+
+lv_obj_t * mmi_ai_talk_recording_screen_create(lv_obj_t * activity_obj)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ if(NULL == activity_obj)
+ {
+ lv_watch_activity_ext_t activity_ext = {0};
+
+ activity_ext.actId = ACT_ID_AI_TALK_RECORDING;
+ activity_ext.create = mmi_ai_talk_recording_screen_create;
+ activity_ext.prepare_destory = mmi_ai_talk_recording_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);
+ LV_ASSERT_MEM(obj);
+
+ lv_ai_talk_recording_ext_t * recording_ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_ai_talk_recording_ext_t));
+ LV_ASSERT_MEM(recording_ext);
+
+ lv_obj_t * cont = lv_cont_create(obj, NULL);
+ lv_obj_set_size(cont, lv_obj_get_width(obj), lv_obj_get_height(obj));
+ lv_obj_align(cont, obj, LV_ALIGN_CENTER, 0, 0);
+ lv_obj_set_style_local_bg_color(cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, lv_color_make(194, 252, 252));
+ //lv_obj_set_click(cont, true);
+ //lv_obj_set_event_cb(cont, mmi_ai_talk_recording_release_event_cb);
+ //lv_obj_add_protect(cont, LV_PROTECT_PRESS_LOST);
+
+ //lv_obj_t * label_warning = lv_label_create(cont, NULL);
+ //lv_obj_set_style_local_text_font(label_warning, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_THEME_WATCH_NIGHT_FONT_SMALL);
+ //lv_obj_set_style_local_text_color(label_warning, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED);
+ //lv_obj_add_style(label_warning, LV_LABEL_PART_MAIN, &lv_watch_font26_black);
+ //lv_label_set_long_mode(label_warning, LV_LABEL_LONG_BREAK);
+ //lv_obj_set_width(label_warning, lv_obj_get_width(obj) * 2 / 3);
+ //lv_label_set_text_id(label_warning, WATCH_TEXT_ID_SLIDE_UP_WARNING);
+ //lv_label_set_align(label_warning, LV_LABEL_ALIGN_CENTER);
+ //lv_obj_align(label_warning, cont, LV_ALIGN_IN_TOP_MID, 0, 50);
+
+ lv_obj_t * label_time = lv_label_create(cont, NULL);
+ lv_obj_add_style(label_time, LV_LABEL_PART_MAIN, &lv_watch_font26_black);
+ const char * rel_snd = lv_lang_get_text(WATCH_TEXT_ID_AUDIO_RECORDING); // WATCH_TEXT_ID_RELEASE_SENDING);
+ uint8_t len = strlen(rel_snd) + 4;
+ char * text = (char *)lv_mem_alloc(len);
+ snprintf(text, len, "%s %d", rel_snd, MMI_AI_TALK_DATA_RECORD_DURATION_MAX);
+ lv_label_set_text(label_time, text);
+ lv_mem_free(text);
+ //lv_obj_align(label_time, label_warning, LV_ALIGN_OUT_BOTTOM_MID, 0, 30);
+ lv_obj_align(label_time, cont, LV_ALIGN_IN_TOP_MID, 0, 75);
+ recording_ext->label = label_time;
+
+ lv_obj_t * img_release_snd = lv_img_create(cont, NULL);
+ lv_img_set_src(img_release_snd, ICON_WECHAT_RECORD_BUTTON_PRESSED);
+ lv_obj_align(img_release_snd, cont, LV_ALIGN_IN_BOTTOM_MID, 0, -8);
+
+ lv_anim_t a;
+ lv_anim_init(&a);
+ lv_anim_set_var(&a, label_time);
+ lv_anim_set_start_cb(&a, (lv_anim_ready_cb_t)mmi_ai_talk_recording_anim);
+ lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
+ lv_anim_set_time(&a, 249);
+ lv_anim_start(&a);
+ s_ai_talk_play_anim_count = 0;
+
+ lv_ai_talk_ext_t * ext = (lv_ai_talk_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK);
+ if(NULL == ext)
+ return NULL;
+
+ if(NULL != ext->record_buffer)
+ {
+ lv_mem_free(ext->record_buffer);
+ ext->record_buffer = NULL;
+ }
+ ext->record_buffer = (uint8_t *)lv_mem_alloc(MMI_AI_TALK_DATA_RECORD_SIZE_MAX);
+ if(NULL != ext->record_buffer)
+ {
+ _lv_memset_00(ext->record_buffer, MMI_AI_TALK_DATA_RECORD_SIZE_MAX);
+
+ if(AUDIO_CTRL_PRIORITY_5 == Hal_Audio_Manage_Start_Req(AUDIO_CTRL_PRIORITY_5, mmi_ai_talk_recording_audio_ctrl_callback))
+ {
+ //Hal_Record_Buffer_Start_Req(ext->record_buffer,
+ // MMI_AI_TALK_DATA_RECORD_SIZE_MAX,
+ // MMI_AI_TALK_DATA_RECORD_DURATION_MAX * 1000,
+ // mmi_ai_talk_recording_cb);
+
+ s_ai_talk_recording_sent_size = 0;
+ Hal_Record_Buffer_With_Format_Req(ext->record_buffer,
+ MMI_AI_TALK_DATA_RECORD_SIZE_MAX,
+ MMI_AI_TALK_DATA_RECORD_DURATION_MAX * 1000,
+ mmi_ai_talk_recording_cb,
+ (mci_type_enum)AI_TALK_AUDIO_FORMAT_TYPE);
+ }
+ }
+
+ return obj;
+}
+
+void mmi_ai_talk_record_button_event_cb(lv_obj_t * obj, lv_event_t e)
+{
+ if(LV_EVENT_LONG_PRESSED == e)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: event=%d\n", __FUNCTION__, __LINE__, e);
+
+ lv_ai_talk_ext_t * ext = mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK);
+ if(NULL == ext)
+ return ;
+
+ mmi_ai_talk_list_set_slide_enable(&ext->old_ext, true); /*reset slide_enable at the end of recording*/
+
+ if(0 == ext->old_ext.element_click_en)
+ {
+ /*sliding to the right, not click button*/
+ return;
+ }
+
+ mmi_ai_talk_list_set_slide_enable(&ext->old_ext, false); /*prevent to slide out while recording*/
+ mmi_ai_talk_recording_screen_create(NULL);
+ }
+ else if(LV_EVENT_CLICKED == e || LV_EVENT_PRESS_LOST == e)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: event=%d\n", __FUNCTION__, __LINE__, e);
+
+ lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_AI_TALK_RECORDING);
+ if(NULL != activity_obj)
+ {
+ lv_ai_talk_ext_t * ext = mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK);
+ if(NULL == ext)
+ return ;
+
+ lv_ai_talk_recording_ext_t * recording_ext = (lv_ai_talk_recording_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK_RECORDING);
+ if(NULL == recording_ext)
+ return NULL;
+
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ mmi_ai_talk_list_set_slide_enable(&ext->old_ext, true); /*reset slide_enable at the end of recording*/
+
+ #if 0
+ lv_indev_t * indev = lv_indev_get_act();
+ if(indev)
+ {
+ lv_coord_t point_y = indev->proc.types.pointer.last_point.y;
+ lv_coord_t img_record_top = obj->coords.y1;
+ if(30 < img_record_top - point_y) // (point_y < (img_record_top - 20))
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: indev_y=%d, img_y=%d\n", __FUNCTION__, __LINE__, point_y, img_record_top);
+ mmi_ai_talk_recording_stop(true);
+ lv_obj_del(activity_obj);
+ //return main list screen
+ mmi_ai_talk_main_screen_refresh();
+
+ return;
+ }
+ }
+ #endif
+
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ mmi_ai_talk_recording_stop(false);
+ lv_obj_del(activity_obj);
+ mmi_ai_talk_sending_screen_create(NULL);
+ }
+ }
+ else if(LV_EVENT_PRESSED == e)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: event=%d\n", __FUNCTION__, __LINE__, e);
+
+ lv_ai_talk_ext_t * ext = mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK);
+ if(NULL == ext)
+ return ;
+
+ //
+ Hal_NFFS_File_Play_End();
+ Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5);
+ Hal_Vibrator_Play_End();
+
+ mmi_ai_talk_voice_item_playing_stop(ext);
+ }
+}
+
+void mmi_ai_talk_voice_item_reset_play_state(lv_ai_talk_list_ext_t * list_page_ext)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ if(NULL == list_page_ext || NULL == list_page_ext->voice_playing_anim.var)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ return;
+ }
+
+ uint8_t msg_from = list_page_ext->voice_playing_msg_from;
+
+ lv_anim_del(list_page_ext->voice_playing_anim.var, NULL);
+ lv_img_set_src(list_page_ext->voice_playing_anim.var, ((0 == msg_from) ? ICON_WECHAT_MY_VOICE_ITEM_PLAYING3 : ICON_WECHAT_OTHER_VOICE_ITEM_PLAYING3));
+ list_page_ext->voice_playing_anim.var = NULL;
+}
+
+void mmi_ai_talk_voice_item_playing_stop(lv_ai_talk_ext_t * ext)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ return;
+
+/*
+ if(NULL == ext || NULL == ext->list)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ return;
+ }
+
+ lv_ai_talk_list_ext_t * list_page_ext = (lv_ai_talk_list_ext_t *)lv_obj_get_ext_attr(ext->list);
+ if(NULL == list_page_ext || NULL == list_page_ext->voice_playing_anim.var)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ return;
+ }
+
+ Hal_File_Play_End();
+ Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5);
+ mmi_ai_talk_voice_item_reset_play_state(list_page_ext);
+*/
+}
+
+void mmi_ai_talk_list_msg_item_style_reset(lv_ai_talk_ext_t * ext)
+{
+ if(NULL == ext || NULL == ext->list)
+ return;
+
+ lv_ai_talk_list_ext_t * list_page_ext = lv_obj_get_ext_attr(ext->list);
+ if(NULL == list_page_ext)
+ return;
+
+ lv_style_reset(&(list_page_ext->style_cont_self));
+ lv_style_reset(&(list_page_ext->style_cont_other));
+ lv_style_reset(&(list_page_ext->style_label_time));
+ //lv_style_reset(&(list_page_ext->style_text));
+ lv_style_reset(&(list_page_ext->style_label_len_self));
+ lv_style_reset(&(list_page_ext->style_label_len_other));
+}
+
+void mmi_ai_talk_list_msg_item_time(char * time_str, hal_rtc_t * cur_time, hal_rtc_t * msg_time, hal_rtc_t * last_msg_time)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ if(0 == last_msg_time->tm_year)
+ {
+ sprintf(time_str, "%d/%d/%d %02d:%02d", msg_time->tm_year, msg_time->tm_mon, msg_time->tm_mday,
+ msg_time->tm_hour, msg_time->tm_min);
+
+ return;
+ }
+
+ uint32_t msg_sec = time_to_seconds(msg_time);
+ uint32_t last_msg_sec = time_to_seconds(last_msg_time);
+ if(msg_sec < last_msg_sec)
+ {
+ sprintf(time_str, "%d/%d/%d %02d:%02d", msg_time->tm_year, msg_time->tm_mon,
+ msg_time->tm_mday, msg_time->tm_hour, msg_time->tm_min);
+ }
+ else if(msg_sec > (last_msg_sec + MMI_AI_TALK_CHAT_TIME_INTERVAL))
+ {
+ uint32_t cur_sec = time_to_seconds(cur_time);
+ if((msg_sec > cur_sec) || (msg_time->tm_year < cur_time->tm_year))
+ {
+ sprintf(time_str, "%d/%d/%d %02d:%02d", msg_time->tm_year, msg_time->tm_mon,
+ msg_time->tm_mday, msg_time->tm_hour, msg_time->tm_min);
+ }
+ else
+ {
+ uint32_t today_sec = cur_sec - cur_time->tm_hour * 3600 - cur_time->tm_min * 60 - cur_time->tm_sec;
+
+ if(msg_sec >= today_sec)
+ {
+ /*today*/
+ sprintf(time_str, "%02d:%02d", msg_time->tm_hour, msg_time->tm_min);
+ }
+ else if(msg_sec >= (today_sec - 24 * 3600))
+ {
+ /*yesterday*/
+ const char * yesterday = lv_lang_get_text(WATCH_TEXT_ID_YESTERDAY);
+
+ sprintf(time_str, "%s %02d:%02d", yesterday, msg_time->tm_hour, msg_time->tm_min);
+ }
+ else
+ {
+ uint8_t wday;
+ if(0 == cur_time->tm_wday)
+ {
+ /*today is Sunday*/
+ wday = 6;
+ }
+ else
+ {
+ wday = cur_time->tm_wday - 1;
+ }
+ /*the start of a week is monday, the end is sunday*/
+ if(msg_sec >= (today_sec - wday * 24 * 3600)) {
+ /*current week before yesterday*/
+ const char * wday_str;
+ switch(rtc_calc_weekday(msg_time))
+ {
+ case 1:
+ /*Monday*/
+ wday_str = lv_lang_get_text(WATCH_TEXT_ID_MONDAY);
+ break;
+ case 2:
+ /*Tuesday*/
+ wday_str = lv_lang_get_text(WATCH_TEXT_ID_TUESDAY);
+ break;
+ case 3:
+ /*Wednesday*/
+ wday_str = lv_lang_get_text(WATCH_TEXT_ID_WEDNESDAY);
+ break;
+ case 4:
+ /*Thursday*/
+ wday_str = lv_lang_get_text(WATCH_TEXT_ID_THURSDAY);
+ break;
+ case 5:
+ /*Friday*/
+ wday_str = lv_lang_get_text(WATCH_TEXT_ID_FRIDAY);
+ break;
+ default:
+ printf("%s: week error\n", __FUNCTION__);
+ break;
+ }
+
+ sprintf(time_str, "%s %02d:%02d", wday_str, msg_time->tm_hour, msg_time->tm_min);
+ }
+ else
+ {
+ sprintf(time_str, "%d/%d %02d:%02d", msg_time->tm_mon, msg_time->tm_mday, msg_time->tm_hour, msg_time->tm_min);
+ }
+ }
+ }
+ }
+}
+
+void mmi_ai_talk_list_voice_item_playing_anim_cb(lv_anim_t * a)
+{
+ lv_obj_t * play_img = (lv_obj_t *)a->var;
+ uint8_t msg_from = mmi_ai_talk_info_index_item_msg_from_get(s_ai_talk_selected_item_index);
+
+ printf("[@CHENG_DEBUG][%s][%d]: msg_from=%d\n", __FUNCTION__, __LINE__, msg_from);
+
+ switch(s_ai_talk_play_anim_count % 3)
+ {
+ case 0:
+ lv_img_set_src(play_img, ((0 == msg_from) ? ICON_WECHAT_MY_VOICE_ITEM_PLAYING1 : ICON_WECHAT_OTHER_VOICE_ITEM_PLAYING1));
+ break;
+
+ case 1:
+ lv_img_set_src(play_img, ((0 == msg_from) ? ICON_WECHAT_MY_VOICE_ITEM_PLAYING2 : ICON_WECHAT_OTHER_VOICE_ITEM_PLAYING2));
+ break;
+
+ case 2:
+ lv_img_set_src(play_img, ((0 == msg_from) ? ICON_WECHAT_MY_VOICE_ITEM_PLAYING3 : ICON_WECHAT_OTHER_VOICE_ITEM_PLAYING3));
+ break;
+
+ default:
+ break;
+ }
+ s_ai_talk_play_anim_count++;
+}
+
+void mmi_ai_talk_list_voice_item_playing_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: priority=%d\n", __FUNCTION__, __LINE__, priority);
+
+ if(AUDIO_CTRL_PRIORITY_5 == priority)
+ {
+ if(false == watch_is_ready())
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ return;
+ }
+ }
+ else if(AUDIO_CTRL_PRIORITY_5 > priority)
+ {
+ lv_ai_talk_ext_t * ext = mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK);
+ if(NULL != ext)
+ {
+ mmi_ai_talk_voice_item_playing_stop(ext);
+ }
+ }
+}
+
+void mmi_ai_talk_list_voice_item_play_over_cb(void * para)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ Hal_File_Play_End();
+ Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5);
+
+ lv_ai_talk_list_ext_t * list_page_ext = (lv_ai_talk_list_ext_t *)para;
+ if(NULL == list_page_ext || NULL == list_page_ext->voice_playing_anim.var)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ return;
+ }
+ mmi_ai_talk_voice_item_reset_play_state(list_page_ext);
+}
+
+void mmi_ai_talk_list_voice_item_play_action(lv_ai_talk_list_ext_t * list_page_ext, lv_obj_t * play_img, lv_obj_t * unread_img)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ //display ui
+ lv_anim_t * a = &(list_page_ext->voice_playing_anim);
+
+ lv_anim_init(a);
+ lv_anim_set_var(a, play_img);
+ lv_anim_set_start_cb(a, (lv_anim_ready_cb_t)mmi_ai_talk_list_voice_item_playing_anim_cb);
+ lv_anim_set_repeat_count(a, LV_ANIM_REPEAT_INFINITE);
+ lv_anim_set_time(a, 400);
+ lv_anim_start(a);
+ s_ai_talk_play_anim_count = 1;
+
+ nv_watch_wechat_msg_item_info_t * msg_item = NULL;
+ mmi_ai_talk_info_index_item_get(s_ai_talk_selected_item_index, &msg_item);
+ msg_item->unread_flag = 0;
+ if(NULL != unread_img)
+ {
+ lv_obj_del(unread_img);
+ unread_img = NULL;
+ }
+ list_page_ext->voice_playing_msg_from = msg_item->msg_from;
+
+ //play voice
+ if(AUDIO_CTRL_PRIORITY_5 == Hal_Audio_Manage_Start_Req(AUDIO_CTRL_PRIORITY_5, mmi_ai_talk_list_voice_item_playing_audio_ctrl_callback))
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ Hal_File_Play_Onetime(msg_item->msg_data_full_file_name, query_current_volume(), mmi_ai_talk_list_voice_item_play_over_cb, list_page_ext, 0);
+ }
+}
+
+void mmi_ai_talk_list_voice_item_event_cb(lv_obj_t * cont, lv_event_t e)
+{
+ lv_ai_talk_list_item_ext_t * list_item_ext = (lv_ai_talk_list_item_ext_t *)lv_obj_get_ext_attr(cont);
+ if(NULL == list_item_ext)
+ return;
+
+ s_ai_talk_selected_item_index = list_item_ext->item_index;
+
+ lv_obj_t * scrl = lv_obj_get_parent(cont);
+ lv_obj_t * list_page = lv_obj_get_parent(scrl);
+ //lv_obj_t * scrl = lv_page_get_scrl(list_page);
+
+ lv_ai_talk_list_ext_t * list_page_ext = (lv_ai_talk_list_ext_t *)lv_obj_get_ext_attr(list_page);
+ if(NULL == list_page_ext)
+ return;
+
+ if(LV_EVENT_PRESSED == e)
+ {
+ list_page_ext->pressing = true;
+ }
+ else if((LV_EVENT_LONG_PRESSED == e) && (true == list_page_ext->pressing)) // delete msg item
+ {
+ list_page_ext->pressing = false;
+
+ mmi_ai_talk_list_msg_item_delete_create();
+ }
+ else if((LV_EVENT_CLICKED == e) && (true == list_page_ext->pressing)) // playing voice msg
+ {
+ list_page_ext->pressing = false;
+
+ nv_watch_wechat_msg_item_info_t * msg_item = NULL;
+ mmi_ai_talk_info_index_item_get(s_ai_talk_selected_item_index, &msg_item);
+
+ if(0 != msg_item->msg_data_size)
+ {
+ if(NULL != list_page_ext->voice_playing_anim.var) // exist voice playing
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: index=%d\n", __FUNCTION__, __LINE__, list_item_ext->item_index);
+
+ //stop item voice
+ Hal_File_Play_End();
+ Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5);
+ mmi_ai_talk_voice_item_reset_play_state(list_page_ext);
+ }
+ else if(NULL != msg_item->msg_data_full_file_name)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: index=%d\n", __FUNCTION__, __LINE__, list_item_ext->item_index);
+
+ lv_obj_t * play_img = lv_obj_get_child_back(cont, NULL);
+ mmi_ai_talk_list_voice_item_play_action(list_page_ext, play_img, ((1 == msg_item->unread_flag) ? list_item_ext->unread_img : NULL));
+ }
+ }
+ }
+}
+
+void mmi_ai_talk_list_text_item_event_cb(lv_obj_t * cont, lv_event_t e)
+{
+ lv_ai_talk_list_item_ext_t * list_item_ext = (lv_ai_talk_list_item_ext_t *)lv_obj_get_ext_attr(cont);
+ if(NULL == list_item_ext)
+ return;
+
+ s_ai_talk_selected_item_index = list_item_ext->item_index;
+
+ lv_obj_t * scrl = lv_obj_get_parent(cont);
+ lv_obj_t * list_page = lv_obj_get_parent(scrl);
+ //lv_obj_t * scrl = lv_page_get_scrl(list_page);
+
+ lv_ai_talk_list_ext_t * list_page_ext = (lv_ai_talk_list_ext_t *)lv_obj_get_ext_attr(list_page);
+ if(NULL == list_page_ext)
+ return;
+
+ if(LV_EVENT_PRESSED == e)
+ {
+ list_page_ext->pressing = true;
+ }
+ else if((LV_EVENT_LONG_PRESSED == e) && (true == list_page_ext->pressing)) // delete msg item
+ {
+ list_page_ext->pressing = false;
+
+ mmi_ai_talk_list_msg_item_delete_create();
+ }
+ else if((LV_EVENT_CLICKED == e) && (true == list_page_ext->pressing)) // display text msg
+ {
+ list_page_ext->pressing = false;
+ }
+}
+
+//display time & content
+lv_obj_t * mmi_ai_talk_list_msg_item_add(lv_obj_t * list_page, nv_watch_wechat_msg_item_info_t * msg_item, char * time_str, uint8_t i)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_obj_t * obj = NULL;
+ lv_ai_talk_list_item_ext_t * list_item_ext = NULL;
+ lv_ai_talk_list_ext_t * list_page_ext = lv_obj_get_ext_attr(list_page);
+ lv_obj_t * scrl = lv_page_get_scrl(list_page);
+ lv_obj_t * last_obj = lv_obj_get_child(scrl, NULL);
+ lv_coord_t obj_y = 0;
+
+ if(NULL != last_obj)
+ {
+ obj_y = lv_obj_get_y(last_obj) + lv_obj_get_height(last_obj) + lv_obj_get_style_pad_inner(scrl, LV_STATE_DEFAULT);
+ }
+ else
+ {
+ obj_y = lv_obj_get_style_pad_top(scrl, LV_STATE_DEFAULT);
+ }
+
+ if(0 != strlen(time_str))
+ {
+ obj = lv_label_create(list_page, NULL);
+
+ //lv_obj_set_base_dir(obj, LV_BIDI_DIR_LTR);
+ lv_label_set_text(obj, time_str);
+ lv_obj_add_style(obj, LV_LABEL_PART_MAIN, &list_page_ext->style_label_time);
+ lv_obj_align(obj, scrl, LV_ALIGN_IN_TOP_MID, 0, obj_y);
+
+ last_obj = obj;
+ obj_y = lv_obj_get_y(last_obj) + lv_obj_get_height(last_obj) + lv_obj_get_style_pad_inner(scrl, LV_STATE_DEFAULT);
+ }
+
+ printf("[@CHENG_DEBUG][%s][%d]: msg_type=%d,file=%s,size=%d,obj_y=%d\n", __FUNCTION__, __LINE__,
+ msg_item->msg_type, msg_item->msg_data_full_file_name, msg_item->msg_data_size, obj_y);
+
+ switch(msg_item->msg_type)
+ {
+ case WECHAT_MSG_TYPE_VOICE:
+ lv_obj_t * unread_img = lv_img_create(list_page, NULL);
+ //obj = lv_img_create(list_page, NULL);
+ obj = lv_cont_create(list_page, NULL);
+ list_item_ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_ai_talk_list_item_ext_t));
+ list_item_ext->item_index = i;
+ list_item_ext->unread_img = NULL;
+ lv_obj_set_size(obj, LV_HOR_RES * 2 / 3, 50);
+ lv_cont_set_fit4(obj, LV_FIT_NONE, LV_FIT_NONE, LV_FIT_NONE, LV_FIT_TIGHT);
+
+ lv_obj_t * play_img = lv_img_create(obj, NULL);
+ lv_obj_t * len_label = lv_label_create(obj, NULL);
+ uint32_t duration = 0;
+
+ if(LV_FS_RES_OK != Hal_File_Get_AudioDurationTime((const char *)msg_item->msg_data_full_file_name, &duration))
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: read file error. %s\n", __FUNCTION__, __LINE__, msg_item->msg_data_full_file_name);
+ }
+ else
+ {
+ duration = (duration + 999) / 1000;
+ }
+
+ if(0 == duration)
+ {
+ /*invalid voice*/
+ lv_img_set_src(play_img, ICON_WECHAT_VOICE_ITEM_DAMAGE);
+ lv_label_set_text(len_label, "");
+ }
+ else
+ {
+ char len_str[8] = {0};
+
+ if(MMI_AI_TALK_DATA_RECORD_DURATION_MAX < duration)
+ duration = MMI_AI_TALK_DATA_RECORD_DURATION_MAX;
+
+ sprintf(len_str, "%d\"", duration);
+ lv_label_set_text(len_label, len_str);
+ }
+
+ if(0 == msg_item->msg_from) // msg from slef
+ {
+ lv_obj_add_style(len_label, LV_LABEL_PART_MAIN, &list_page_ext->style_label_len_self);
+ //lv_img_set_src(obj, ICON_WECHAT_MY_VOICE_ITEM_BG);
+ lv_obj_add_style(obj, LV_CONT_PART_MAIN, &(list_page_ext->style_cont_self));
+ lv_obj_align(obj, scrl, LV_ALIGN_IN_TOP_RIGHT, -10, obj_y);
+ if(0 < duration)
+ {
+ lv_img_set_src(play_img, ICON_WECHAT_MY_VOICE_ITEM_PLAYING3);
+ }
+ lv_obj_align(play_img, obj, LV_ALIGN_IN_LEFT_MID, 15, 0);
+ lv_obj_align(len_label, play_img, LV_ALIGN_OUT_RIGHT_MID, 10, 0);
+ lv_obj_del(unread_img);
+ }
+ else // msg from other
+ {
+ lv_obj_add_style(len_label, LV_LABEL_PART_MAIN, &list_page_ext->style_label_len_other);
+ //lv_img_set_src(obj, ICON_WECHAT_OTHER_VOICE_ITEM_BG);
+ lv_obj_add_style(obj, LV_CONT_PART_MAIN, &(list_page_ext->style_cont_other));
+ lv_obj_align(obj, scrl, LV_ALIGN_IN_TOP_LEFT, 10, obj_y);
+ if(0 < duration)
+ {
+ lv_img_set_src(play_img, ICON_WECHAT_OTHER_VOICE_ITEM_PLAYING3);
+ }
+ lv_obj_align(play_img, obj, LV_ALIGN_IN_RIGHT_MID, -15, 0);
+ lv_obj_align(len_label, play_img, LV_ALIGN_OUT_LEFT_MID, -10, 0);
+ if(1 == msg_item->unread_flag)
+ {
+ lv_img_set_src(unread_img, ICON_WECHAT_UNREAD_FLAG);
+ lv_obj_align(unread_img, obj, LV_ALIGN_OUT_RIGHT_MID, 5, 0);
+ list_item_ext->unread_img = unread_img;
+ }
+ else
+ {
+ lv_obj_del(unread_img);
+ }
+ }
+
+ lv_obj_set_click(obj, true);
+ lv_obj_set_event_cb(obj, mmi_ai_talk_list_voice_item_event_cb);
+ lv_obj_set_adv_hittest(obj, false);
+ lv_page_focus(list_page, obj, 0);
+ lv_page_glue_obj(obj, true);
+ lv_watch_obj_add_element(obj);
+ break;
+
+ case WECHAT_MSG_TYPE_TEXT:
+ obj = lv_cont_create(list_page, NULL);
+ list_item_ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_ai_talk_list_item_ext_t));
+ list_item_ext->item_index = i;
+ list_item_ext->unread_img = NULL;
+ #if 1
+ lv_obj_set_size(obj, LV_HOR_RES - 30, 50); //lv_obj_set_size(obj, 153, 53); // same with voice item
+ lv_cont_set_fit4(obj, LV_FIT_NONE, LV_FIT_NONE, LV_FIT_NONE, LV_FIT_TIGHT);
+ //lv_cont_set_layout(obj, LV_LAYOUT_COLUMN_LEFT);
+ lv_obj_add_style(obj, LV_CONT_PART_MAIN, &(list_page_ext->style_cont_other));
+ lv_obj_align(obj, scrl, LV_ALIGN_IN_TOP_MID, 0, obj_y);
+ #else
+ lv_obj_set_size(obj, LV_HOR_RES * 2 / 3, 50); //lv_obj_set_size(obj, 153, 53); // same with voice item
+ lv_cont_set_fit4(obj, LV_FIT_NONE, LV_FIT_NONE, LV_FIT_NONE, LV_FIT_TIGHT);
+ //lv_cont_set_layout(obj, LV_LAYOUT_COLUMN_LEFT);
+ lv_obj_add_style(obj, LV_CONT_PART_MAIN, &(list_page_ext->style_cont_other));
+ lv_obj_align(obj, scrl, LV_ALIGN_IN_TOP_LEFT, 10, obj_y);
+ #endif
+
+ lv_fs_file_t file_p;
+ lv_fs_res_t res;
+ uint32_t file_size = 0, bytes_read = 0;
+ char * file_buf = NULL;
+
+ res = lv_fs_open(&file_p, msg_item->msg_data_full_file_name, LV_FS_MODE_RD);
+ if(LV_FS_RES_OK != res)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
+ lv_fs_close(&file_p);
+ break;
+ }
+
+ lv_fs_size(&file_p, &file_size);
+ file_buf = (char *)lv_mem_alloc(file_size + 1);
+ _lv_memset_00(file_buf, file_size + 1);
+ res = lv_fs_read(&file_p, file_buf, file_size, &bytes_read);
+ lv_fs_close(&file_p);
+ if(LV_FS_RES_OK != res)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
+ lv_mem_free(file_buf);
+ break;
+ }
+ printf("[@CHENG_DEBUG][%s][%d]: %d,%d,%s\n", __FUNCTION__, __LINE__, file_size, bytes_read, file_buf);
+
+ lv_obj_t * label_text = lv_label_create(obj, NULL);
+ lv_obj_add_style(label_text, LV_LABEL_PART_MAIN, &(list_page_ext->style_label_len_other));
+ lv_label_set_align(label_text, LV_LABEL_ALIGN_CENTER);
+ lv_label_set_long_mode(label_text, LV_LABEL_LONG_BREAK);
+ lv_obj_set_width(label_text, lv_obj_get_width(obj) - 20);
+ lv_label_set_text(label_text, file_buf);
+ lv_obj_align(label_text, obj, LV_ALIGN_IN_LEFT_MID, 10, 0);
+
+ lv_obj_set_click(obj, true);
+ lv_obj_set_event_cb(obj, mmi_ai_talk_list_text_item_event_cb);
+ lv_obj_set_adv_hittest(obj, false);
+ lv_page_focus(list_page, obj, 0);
+ lv_page_glue_obj(obj, true);
+ lv_watch_obj_add_element(obj);
+
+ lv_mem_free(file_buf);
+ break;
+
+ case WECHAT_MSG_TYPE_EXPRESSION:
+ case WECHAT_MSG_TYPE_IMAGE:
+ #if 0
+ obj = lv_img_create(list, NULL);
+
+ lv_watch_obj_add_element(obj);
+ #endif
+ break;
+
+ default:
+ break;
+ }
+
+ return obj;
+}
+
+lv_res_t mmi_ai_talk_list_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, void * param)
+{
+ lv_res_t res;
+
+ /* Include the ancient signal function */
+ res = ancient_scrl_signal(scrl, sign, param);
+ if(res != LV_RES_OK)
+ return res;
+
+ if(LV_SIGNAL_COORD_CHG == sign)
+ {
+ lv_obj_t * list_page = lv_obj_get_parent(scrl);
+ lv_ai_talk_list_ext_t * list_page_ext = (lv_ai_talk_list_ext_t *)lv_obj_get_ext_attr(list_page);
+ if(NULL == list_page_ext)
+ return;
+
+ if(true == list_page_ext->pressing)
+ {
+ list_page_ext->pressing = false;
+ }
+ }
+
+ return LV_RES_OK;
+}
+
+void mmi_ai_talk_list_create(lv_obj_t * obj, lv_ai_talk_ext_t * ext)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_obj_t * list_page = lv_page_create(obj, NULL);
+ lv_ai_talk_list_ext_t * list_page_ext = lv_obj_allocate_ext_attr(list_page, sizeof(lv_ai_talk_list_ext_t));
+ if(NULL == ext)
+ return;
+
+ lv_obj_set_size(list_page, lv_obj_get_width(obj), lv_obj_get_height(obj) - 5 - lv_obj_get_height(ext->img_record) - 8);
+ lv_page_set_scrollbar_mode(list_page, LV_SCROLLBAR_MODE_OFF);
+ lv_obj_set_style_local_bg_opa(list_page, LV_PAGE_PART_BG, LV_STATE_DEFAULT, LV_OPA_0);
+ lv_obj_set_style_local_border_opa(list_page, LV_PAGE_PART_BG, LV_STATE_DEFAULT, LV_OPA_0);
+ lv_obj_set_style_local_outline_width(list_page, LV_PAGE_PART_BG, LV_STATE_DEFAULT, 0);
+ //lv_obj_set_style_local_pad_bottom(list_page, LV_PAGE_PART_SCROLLABLE, LV_STATE_DEFAULT, 4);
+ //lv_obj_set_style_local_pad_top(list_page, LV_PAGE_PART_SCROLLABLE, LV_STATE_DEFAULT, 2);
+ //lv_obj_set_style_local_pad_inner(list_page, LV_PAGE_PART_SCROLLABLE, LV_STATE_DEFAULT, 8);
+ //lv_obj_set_style_local_bg_color(list_page, LV_PAGE_PART_SCROLLBAR, LV_STATE_DEFAULT, lv_color_make(16, 112, 194));
+ //lv_obj_set_style_local_pad_inner(list_page, LV_PAGE_PART_SCROLLBAR, LV_STATE_DEFAULT, LV_DPI / 20);
+ //lv_obj_set_style_local_pad_left(list_page, LV_PAGE_PART_SCROLLBAR, LV_STATE_DEFAULT, 0);
+ //lv_obj_set_style_local_pad_right(list_page, LV_PAGE_PART_SCROLLBAR, LV_STATE_DEFAULT, 0);
+ //lv_obj_set_style_local_radius(list_page, LV_PAGE_PART_SCROLLBAR, LV_STATE_DEFAULT, 0);
+
+ lv_page_set_scrl_layout(list_page, LV_LAYOUT_OFF);
+ lv_page_set_scrollable_fit2(list_page, LV_FIT_NONE, LV_FIT_TIGHT);
+
+ lv_obj_t * scrl = lv_page_get_scrollable(list_page);
+ ancient_scrl_signal = lv_obj_get_signal_cb(scrl);
+ lv_obj_set_signal_cb(scrl, mmi_ai_talk_list_scrl_signal);
+
+ lv_watch_obj_add_element(list_page);
+ lv_watch_obj_add_element(scrl);
+
+ lv_style_init(&(list_page_ext->style_label_time));
+ lv_style_copy(&(list_page_ext->style_label_time), &lv_watch_font20);
+ lv_style_set_text_color(&(list_page_ext->style_label_time), LV_STATE_DEFAULT, lv_color_make(20, 187, 242));
+
+ //lv_style_init(&(list_page_ext->style_text));
+ //lv_style_copy(&(list_page_ext->style_text), &lv_style_pretty);
+ //lv_style_set_bg_color(&(list_page_ext->style_text), LV_STATE_DEFAULT, lv_color_make(0xFF, 0xE1, 0xE1));
+ //lv_style_set_border_width(&(list_page_ext->style_text), LV_STATE_DEFAULT, 0);
+ //lv_style_set_shadow_width(&(list_page_ext->style_text), LV_STATE_DEFAULT, 0);
+
+ lv_style_init(&(list_page_ext->style_label_len_other));
+ lv_style_copy(&(list_page_ext->style_label_len_other), &lv_watch_font26);
+ lv_style_set_text_color(&(list_page_ext->style_label_len_other), LV_STATE_DEFAULT, lv_color_make(202, 134, 255));
+
+ lv_style_init(&(list_page_ext->style_label_len_self));
+ lv_style_copy(&(list_page_ext->style_label_len_self), &lv_watch_font26);
+ lv_style_set_text_color(&(list_page_ext->style_label_len_self), LV_STATE_DEFAULT, lv_color_make(108, 189, 5));
+
+ lv_style_init(&(list_page_ext->style_cont_self));
+ lv_style_set_bg_color(&(list_page_ext->style_cont_self), LV_STATE_DEFAULT, LV_COLOR_MAKE(175, 242, 89));
+ lv_style_set_radius(&(list_page_ext->style_cont_self), LV_STATE_DEFAULT, 15); // 30
+ lv_style_set_pad_top(&(list_page_ext->style_cont_self), LV_STATE_DEFAULT, 10); // 8
+ lv_style_set_pad_bottom(&(list_page_ext->style_cont_self), LV_STATE_DEFAULT, 10); // 8
+ lv_style_set_pad_left(&(list_page_ext->style_cont_self), LV_STATE_DEFAULT, 5); // 8
+ lv_style_set_pad_right(&(list_page_ext->style_cont_self), LV_STATE_DEFAULT, 5); // 8
+
+ lv_style_init(&(list_page_ext->style_cont_other));
+ lv_style_set_bg_color(&(list_page_ext->style_cont_other), LV_STATE_DEFAULT, LV_COLOR_MAKE(0xE2, 0xBD, 0xFF));
+ lv_style_set_radius(&(list_page_ext->style_cont_other), LV_STATE_DEFAULT, 15);
+ lv_style_set_pad_top(&(list_page_ext->style_cont_other), LV_STATE_DEFAULT, 10);
+ lv_style_set_pad_bottom(&(list_page_ext->style_cont_other), LV_STATE_DEFAULT, 10);
+ lv_style_set_pad_left(&(list_page_ext->style_cont_other), LV_STATE_DEFAULT, 5);
+ lv_style_set_pad_right(&(list_page_ext->style_cont_other), LV_STATE_DEFAULT, 5);
+
+ _lv_memset_00(&(list_page_ext->voice_playing_anim), sizeof(lv_anim_t));
+ list_page_ext->voice_playing_msg_from = 0;
+ list_page_ext->pressing = false;
+ ext->list = list_page;
+
+ uint8_t i = 0;
+ uint8_t msg_count = mmi_ai_talk_info_count_get();
+ hal_rtc_t cur_time = {0}, last_msg_item_time = {0}, msg_time = {0};
+
+ Hal_Rtc_Gettime(&cur_time);
+ for(i = 0; i < msg_count; i++)
+ {
+ printf("[@CHENG_DEBUG][%s][%d]: i=%d, msg_count=%d\n", __FUNCTION__, __LINE__, i, msg_count);
+
+ char time_str[32] = {0};
+ nv_watch_wechat_msg_item_info_t * msg_item = NULL;
+
+ mmi_ai_talk_info_index_item_get(i, &msg_item);
+ _lv_memcpy(&msg_time, &(msg_item->msg_time), sizeof(hal_rtc_t));
+ mmi_ai_talk_list_msg_item_time(time_str, &cur_time, &msg_time, &last_msg_item_time);
+ _lv_memcpy(&last_msg_item_time, &(msg_item->msg_time), sizeof(hal_rtc_t));
+
+ mmi_ai_talk_list_msg_item_add(list_page, msg_item, time_str, i);
+ }
+
+ if((lv_obj_get_height(list_page) - lv_obj_get_style_pad_top(list_page, LV_LIST_PART_BG) * 2) > lv_obj_get_height(scrl))
+ {
+ lv_cont_set_layout(scrl, LV_LAYOUT_OFF);
+ }
+}
+
+void mmi_ai_talk_main_screen_refresh(void)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_ai_talk_ext_t * ext = mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK);
+ if(NULL == ext)
+ return;
+
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ mmi_ai_talk_list_set_slide_enable(&ext->old_ext, true);
+
+ mmi_ai_talk_voice_item_playing_stop(ext);
+
+ mmi_ai_talk_list_msg_item_style_reset(ext);
+ if(NULL != ext->list)
+ {
+ lv_obj_del(ext->list);
+ ext->list = NULL;
+ }
+
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ if(NULL != ext->delete_timer_id)
+ {
+ Hal_Timer_Stop(ext->delete_timer_id);
+ ext->delete_timer_id = NULL;
+ }
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+ if(NULL != ext->delete_bg)
+ {
+ lv_obj_del(ext->delete_bg);
+ ext->delete_bg = NULL;
+ }
+
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ uint8_t msg_count = mmi_ai_talk_info_count_get();
+ if(0 == msg_count)
+ {
+
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_obj_set_hidden(ext->label_no_msg, false);
+ }
+ else
+ {
+
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_obj_set_hidden(ext->label_no_msg, true);
+
+ mmi_ai_talk_list_create(ext->cont, ext);
+ }
+}
+
+lv_obj_t * mmi_ai_talk_create(lv_obj_t * activity_obj)
+{
+ printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ if(activity_obj == NULL)
+ {
+ lv_watch_activity_ext_t activity_ext;
+
+ _lv_memset_00(&activity_ext, sizeof(lv_watch_activity_ext_t));
+ activity_ext.actId = ACT_ID_AI_TALK;
+ activity_ext.create = (lv_watch_activity_create_f_t)mmi_ai_talk_create; //NULL;
+ activity_ext.prepare_destory = mmi_ai_talk_prepare_destory;
+ activity_obj = lv_watch_creat_activity_obj(&activity_ext);
+ LV_ASSERT_MEM(activity_obj);
+ }
+
+ lv_obj_t * obj = lv_watch_obj_create(activity_obj);
+ if(NULL == obj)
+ return NULL;
+ /*Allocate the tab type specific extended data*/
+ lv_ai_talk_ext_t * ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_ai_talk_ext_t));
+ if(NULL == ext)
+ return NULL;
+
+ ext->cont = NULL;
+ ext->list = NULL;
+ ext->delete_timer_id = NULL;
+ ext->delete_bg = NULL;
+ ext->record_buffer = NULL;
+ ext->record_size = 0;
+
+ lv_obj_t * cont = lv_cont_create(obj, NULL);
+ lv_obj_set_size(cont, lv_obj_get_width(obj), lv_obj_get_height(obj));
+ lv_obj_align(cont, obj, LV_ALIGN_CENTER, 0, 0);
+ lv_obj_set_style_local_bg_color(cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, lv_color_make(194, 252, 252));
+ lv_watch_obj_add_element(cont);
+ ext->cont = cont;
+
+ if(false == watch_modem_sim_present_check_req()
+ //|| (MMI_MODEM_SIGNAL_BAR_0 == watch_modem_get_signal_bar_req())
+ )
+ {
+ // no network
+ lv_obj_t * label = lv_label_create(cont, NULL);
+ lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font26_black);
+ lv_label_set_text_id(label, WATCH_TEXT_ID_DEVICE_NO_NETWORK);
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_obj_align(label, cont, LV_ALIGN_CENTER, 0, -10);
+
+ return obj;
+ }
+/*
+ else if(true != mmi_watch_tcp_connect_state_get()
+ || true != mmi_protocol_watch_bind_state_get()
+ )
+ {
+ // not bind
+ lv_obj_t * label = lv_label_create(cont, NULL);
+ lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font26_black);
+ lv_label_set_text_id(label, WATCH_TEXT_ID_DEVICE_NOT_BIND);
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_obj_align(label, cont, LV_ALIGN_CENTER, 0, -10);
+
+ return obj;
+ }
+*/
+
+ //create no msg label
+ ext->label_no_msg = lv_label_create(cont, NULL);
+ lv_obj_add_style(ext->label_no_msg, LV_LABEL_PART_MAIN, &lv_watch_font26_black);
+ lv_label_set_text_id(ext->label_no_msg, WATCH_TEXT_ID_PRESS_TO_TALK);
+ //lv_label_set_align(ext->label_no_msg, LV_LABEL_ALIGN_CENTER);
+ lv_obj_align(ext->label_no_msg, cont, LV_ALIGN_CENTER, 0, -10);
+
+ ext->img_record = lv_img_create(cont, NULL);
+ lv_img_set_src(ext->img_record, ICON_WECHAT_RECORD_BUTTON);
+ lv_obj_set_click(ext->img_record, true);
+ lv_obj_set_event_cb(ext->img_record, mmi_ai_talk_record_button_event_cb);
+ lv_obj_set_adv_hittest(ext->img_record, false);
+ lv_obj_add_protect(ext->img_record, LV_PROTECT_PRESS_LOST);
+ lv_watch_obj_add_element(ext->img_record);
+ lv_obj_align(ext->img_record, cont, LV_ALIGN_IN_BOTTOM_MID, 0, -8);
+
+ uint8_t msg_count = mmi_ai_talk_info_count_get();
+ if(0 == msg_count)
+ {
+ lv_obj_set_hidden(ext->label_no_msg, false);
+ }
+ else
+ {
+ lv_obj_set_hidden(ext->label_no_msg, true);
+
+ mmi_ai_talk_list_create(cont, ext);
+ }
+
+ return obj;
+}
+
+void mmi_ai_talk_create_event_cb(lv_obj_t * btn, lv_event_t e)
+{
+ if(LV_EVENT_CLICKED == e)
+ {
+ //
+ static uint8_t task_init_flag = 0;
+ if(0 == task_init_flag)
+ {
+ mm_ai_talk_task_init();
+ task_init_flag = 1;
+ }
+ mmi_ai_talk_tcp_connect_msg(NULL);
+
+ //
+ mmi_ai_talk_info_init();
+
+ lv_watch_png_cache_all_free();
+ lv_obj_t * obj = mmi_ai_talk_create(NULL);
+ LV_ASSERT_MEM(obj);
+ }
+}
+
+#endif