#include "include.h" #include "func.h" #include "app_variable.h" #if TRACE_EN #define TRACE(...) printf(__VA_ARGS__) #else #define TRACE(...) #endif #define ICS_MAX_COUNTRY_CODE_LEN 4 enum { COMPO_ID_LISTBOX = 1, COMPO_ID_TXT, COMPO_ID_PIC, }; typedef struct f_address_book_list_t_ { compo_listbox_t *listbox; // 临时使用pbap的数据,后续有app使用contact_info_t格式 } f_address_book_list_t; static u8 call_book_cnt; static const compo_listbox_item_t tbl_call_list[ADDRESS_BOOK_LIST_CNT] = {0}; compo_listbox_custom_item_t tbl_call_txt_list[ADDRESS_BOOK_LIST_CNT] = {0}; const char ics_chinacode_str[][ICS_MAX_COUNTRY_CODE_LEN + 2 + 1] = { {'0', '0', '7', '\0'}, // 俄罗斯 {'+', '7', '\0'}, {'0', '0', '8', '6', '\0'}, // 中国 {'+', '8', '6', '\0'}, {'0', '0', '8', '4', '\0'}, // 越南 {'+', '8', '4', '\0'}, {'0', '0', '4', '4', '\0'}, // 英国 {'+', '4', '4', '\0'}, {'0', '0', '3', '4', '\0'}, // 西班牙 {'+', '3', '4', '\0'}, {'0', '0', '3', '3', '\0'}, // 法国 {'+', '3', '3', '\0'}, {'0', '0', '3', '9', '\0'}, // 意大利 {'+', '3', '9', '\0'}, {'0', '0', '4', '8', '\0'}, // 波兰 {'+', '4', '8', '\0'}, {'0', '0', '3', '5', '1', '\0'}, // 葡萄牙 {'+', '3', '5', '1', '\0'}, {'0', '0', '4', '9', '\0'}, // 德国 {'+', '4', '9', '\0'}, {'0', '0', '6', '0', '\0'}, // 马来西亚 {'+', '6', '0', '\0'}, {'0', '0', '6', '6', '\0'}, // 泰国 {'+', '6', '6', '\0'}, {'0', '0', '9', '0', '\0'}, // 土耳其 {'+', '9', '0', '\0'}, {'0', '0', '9', '7', '1', '\0'}, // 阿拉伯 {'+', '9', '7', '1', '\0'}, {'0', '0', '3', '8', '7', '\0'}, // 波斯 {'+', '3', '8', '7', '\0'}, {'0', '0', '4', '2', '0', '\0'}, // 捷克 {'+', '4', '2', '0', '\0'}, }; u8 phonebook_ics_remove_prefix(u8 *number,u8 numberlen) { u8 len = numberlen; int i=0; u8 lg=sizeof(ics_chinacode_str)/sizeof(ics_chinacode_str[0]); /*remove international code of China, such as 0086, +86 and so on*/ while(i 0) { /* hit */ memcpy(name, &SysVariable.pb_list[i].name, strlen(&SysVariable.pb_list[i].name)); name[strlen(&SysVariable.pb_list[i].name)] = '\0'; vaild_flag = 1; } break; } } printf("%d:%s\n", vaild_flag, name); if (vaild_flag) { return strlen(name); } else { return 0; } } //创建电话簿窗体 compo_form_t *func_address_book_form_create(void) { //新建窗体和背景 compo_form_t *frm = compo_form_create(true); f_address_book_list_t *f_book = (f_address_book_list_t *)func_cb.f_cb; //设置标题栏 compo_form_set_mode(frm, COMPO_FORM_MODE_SHOW_TITLE | COMPO_FORM_MODE_SHOW_TIME); compo_form_set_title(frm, i18n[STR_CALL_LINK]); //新建列表 compo_listbox_t *listbox = compo_listbox_create(frm, COMPO_LISTBOX_STYLE_TITLE_NORMAL); compo_setid(listbox, COMPO_ID_LISTBOX); if(call_book_cnt){ compo_listbox_set(listbox, tbl_call_list, call_book_cnt); compo_listbox_set_bgimg(listbox, UI_BUF_COMMON_BG_BIN); compo_listbox_set_text_modify(listbox, tbl_call_txt_list); compo_listbox_set_focus_byidx(listbox, 1); compo_listbox_update(listbox); listbox->mcb = func_zalloc(sizeof(compo_listbox_move_cb_t)); // 建立移动控制块,退出时需要释放 compo_listbox_move_init_modify(listbox, GUI_SCREEN_HEIGHT * 3 / 8, compo_listbox_gety_byidx(listbox, call_book_cnt - (call_book_cnt >= 2 ? 2 : 1))); } else { // 创建 暂无通话记录 文本框 compo_textbox_t *txt = compo_textbox_create(frm, 50); compo_setid(txt, COMPO_ID_TXT); compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, 95+25, GUI_SCREEN_WIDTH - 20, 50); compo_textbox_set_multiline(txt, true); compo_textbox_set_autoroll_mode(txt, TEXT_AUTOROLL_MODE_SROLL_CIRC); compo_textbox_set(txt, i18n[STR_NO_CONTACT]); compo_textbox_set_visible(txt, true); compo_picturebox_t *pic = compo_picturebox_create(frm, UI_BUF_COMMON_NOT_CONTACTS_BIN); compo_setid(pic, COMPO_ID_PIC); compo_picturebox_set_pos(pic, GUI_SCREEN_CENTER_X, 45+21); compo_picturebox_set_visible(pic, true); } return frm; } static void func_address_book_sync_pb_callback(void *info, u16 count) { f_address_book_list_t *f_book = (f_address_book_list_t *)func_cb.f_cb; compo_textbox_t *txt = compo_getobj_byid(COMPO_ID_TXT); compo_picturebox_t *pic = compo_getobj_byid(COMPO_ID_PIC); call_book_cnt = 0; if (info == NULL || count == 0) { printf("[%s]:error!",__func__); return; } pbap_pb_buf_t *pb_buf = (pbap_pb_buf_t *)info; for (u16 i = 0; i < count; i++) { if(strlen(pb_buf[i].name) > PBAP_MAX_NAME_LEN) { pb_buf[i].name[PBAP_MAX_NAME_LEN-1] = '\0'; } if (strlen(pb_buf[i].name) > LISTBOX_TEXT_LEN - 2) { printf("[%s]:str len = %d exceeds the max!\n", pb_buf[i].name,strlen(pb_buf[i].name)); continue; } if (call_book_cnt >= ADDRESS_BOOK_LIST_CNT) { break; } sprintf(tbl_call_txt_list[i].str_txt, "%s", pb_buf[i].name); printf("func_address_book_sync_pb_callback %s %s\n",pb_buf[i].name,pb_buf[i].num); call_book_cnt++; } if(call_book_cnt){ compo_listbox_t *listbox = compo_getobj_byid(COMPO_ID_LISTBOX); compo_listbox_set(listbox, tbl_call_list, call_book_cnt); compo_listbox_set_bgimg(listbox, UI_BUF_COMMON_BG_BIN); compo_listbox_set_text_modify(listbox, tbl_call_txt_list); compo_listbox_set_focus_byidx(listbox, 1); compo_listbox_update(listbox); if (listbox->mcb == NULL) { listbox->mcb = func_zalloc(sizeof(compo_listbox_move_cb_t)); // 建立移动控制块,退出时需要释放 } compo_listbox_move_init_modify(listbox, GUI_SCREEN_HEIGHT * 3 / 8, compo_listbox_gety_byidx(listbox, call_book_cnt - (call_book_cnt >= 2 ? 2 : 1))); if (txt) { compo_textbox_set_visible(txt,false); } if (pic) { compo_picturebox_set_visible(pic,false); } } } //点进图标进入应用 void func_address_book_icon_click(void) { int icon_idx; u8 i = 0; f_address_book_list_t *f_book = (f_address_book_list_t *)func_cb.f_cb; pbap_pb_buf_t *pb_list = SysVariable.pb_list; compo_listbox_t *listbox = f_book->listbox; icon_idx = compo_listbox_select(listbox, ctp_get_sxy()); if (icon_idx < 0 || icon_idx >= ADDRESS_BOOK_LIST_CNT) { return; } memset(sys_cb.outgoing_number, 0, 20); for (i = 0; i < 20; i++) { sys_cb.outgoing_number[i] = pb_list[icon_idx].num[i]; } if(bt_is_connected()){ bt_call_redial_number(); } else{ func_popup_new(POPUP_ID_BT_REMIND); } } //电话簿功能事件处理 static void func_address_book_process(void) { f_address_book_list_t *f_book = (f_address_book_list_t *)func_cb.f_cb; compo_listbox_move(f_book->listbox); /* 同步列表:顶部下拉列表触底后松手反弹,重新同步 */ static bool touch_flag = false; if (ctp_get_sxy().y < 20 && f_book->listbox->ofs_y <= 10 && f_book->listbox->mcb->flag_move_auto) { touch_flag = true; } if (touch_flag && f_book->listbox->ofs_y == f_book->listbox->mcb->first_y) { touch_flag = false; if (bt_is_connected()) { func_popup_new(POPUP_ID_SYNCING); if (!bt_pbap_is_syncing()) { bt_pbap_sync_start(PBAP_OBJECT_PB, SysVariable.pb_list, ADDRESS_BOOK_LIST_CNT, func_address_book_sync_pb_callback); } } else { func_popup_new(POPUP_ID_BT_REMIND); } } func_process(); } //电话簿功能消息处理 static void func_address_book_message(size_msg_t msg) { f_address_book_list_t *f_book = (f_address_book_list_t *)func_cb.f_cb; compo_listbox_t *listbox = f_book->listbox; if (compo_listbox_message(listbox, msg)) { return; // 处理列表框信息 } switch (msg) { case MSG_CTP_CLICK: func_address_book_icon_click(); break; case MSG_CTP_LONG: break; case MSG_CTP_LONG_DOWN: case MSG_CTP_SHORT_DOWN: if (bt_is_connected()) { if (!bt_pbap_is_syncing()) { func_popup_new(POPUP_ID_SYNCING); bt_pbap_sync_start(PBAP_OBJECT_PB, SysVariable.pb_list, ADDRESS_BOOK_LIST_CNT, func_address_book_sync_pb_callback); } } else { func_popup_new(POPUP_ID_BT_REMIND); } break; case MSG_CTP_SHORT_RIGHT: bt_pbap_sync_stop(); func_message(msg); break; case KU_DELAY_BACK: if (tick_check_expire(func_cb.enter_tick, TICK_IGNORE_KEY)) { } break; default: func_message(msg); break; } } //进入电话簿功能 static void func_address_book_enter(void) { func_cb.f_cb = func_zalloc(sizeof(f_address_book_list_t)); func_cb.frm_main = func_address_book_form_create(); f_address_book_list_t *f_book = (f_address_book_list_t *)func_cb.f_cb; f_book->listbox = compo_getobj_byid(COMPO_ID_LISTBOX); compo_listbox_t *listbox = f_book->listbox; if (listbox->type != COMPO_TYPE_LISTBOX) { halt(HALT_GUI_COMPO_LISTBOX_TYPE); } func_cb.enter_tick = tick_get(); /* 进入后如BT属连接状态且没有通话记录则自动同步 */ if (!bt_pbap_is_syncing() && bt_is_connected() && !call_book_cnt) { func_popup_new(POPUP_ID_SYNCING); bt_pbap_sync_start(PBAP_OBJECT_PB, SysVariable.pb_list, ADDRESS_BOOK_LIST_CNT, func_address_book_sync_pb_callback); } } //退出电话簿功能 static void func_address_book_exit(void) { f_address_book_list_t *f_book = (f_address_book_list_t *)func_cb.f_cb; compo_listbox_t *listbox = f_book->listbox; bt_pbap_sync_stop(); if (listbox->mcb) { func_free(listbox->mcb); // 释放移动控制块 } func_cb.last = FUNC_ADDRESS_BOOK; } //电话簿功能 void func_address_book(void) { func_address_book_enter(); while (func_cb.sta == FUNC_ADDRESS_BOOK) { func_address_book_process(); func_address_book_message(msg_dequeue()); } func_address_book_exit(); }