一、电话簿菜单资源结构
MAIN_MENU_PHONEBOOK_MENUID
MENU_ID_PHB_QUICK_SEARCH
MITEM101_PBOOK_SEARCH_ENTRY,
MITEM111_PBOOK_VIEW_ENTRY,
MITEM111_PBOOK_VIEW_SIMA_ENTRY,
MITEM111_PBOOK_VIEW_SIMB_ENTRY,
MITEM111_PBOOK_VIEW_PHONE_ENTRY,
MITEM111_PBOOK_VIEW_ALL_ENTRY,
MITEM102_PBOOK_NEW_ENTRY,
MITEM_ADD_ENTRY_TO_SIM,
MENU_MTPNP_PB_ADD_SIM2,
MITEM_ADD_ENTRY_TO_PHONE,
MITEM104_PBOOK_COPY_ALL,
MITEM_PBOOK_COPY_ALL_SIM,
MENU_MTPNP_PB_COPYALL_SIM2TOPHONE,
MITEM_PBOOK_COPY_ALL_PHONE,
MENU_MTPNP_PB_COPYALL_PHONETOSIM2,
MITEM103_PBOOK_DELETE_ALL,
MITEM_PBOOK_DELETE_ALL_SIM,
MENU_MTPNP_PB_DELALL_SIM2,
MITEM_PBOOK_DELETE_ALL_PHONE,
MENU_ID_PHB_DELETE_ALL_ONE_BY_ONE,
MITEM109_PBOOK_CALLER_GROUPS
MITEM111_PBOOK_IMPORTOUTPORT_ENTRY
MITEM111_PBOOK_OUTPORTTOFILE_ENTRY,
MITEM111_PBOOK_IMPORTFROMFILE_ENTRY
MITEM110_PBOOK_SETTINGS
进入某个entry的option选项:
MITEM101_PBOOK_VIEW_OPTIONS
MENU_ID_PHB_OPTION_IP_DIAL
MITEM1010_PBOOK_VIEW,
MITEM1011_PBOOK_EDIT,
MITEM1012_PBOOK_DELETE
MITEM1013_PBOOK_COPY_ENTRY,
MITEM1014_PBOOK_MOVE,
MENU_ID_PHB_OPTION_SEND_SMS,
MENU_ID_PHB_OPTION_SEND_MMS,
Copy菜单:
MITEM1013_PBOOK_COPY_ENTRY
MENU_MTPNP_PB_MOVE_SIM1TOPHONE,
MENU_MTPNP_PB_MOVE_PHONETOSIM1,
MENU_MTPNP_PB_MOVE_SIM2TOSIM1,
MENU_MTPNP_PB_MOVE_SIM1TOSIM2,
MENU_MTPNP_PB_MOVE_SIM2TOPHONE,
MENU_MTPNP_PB_MOVE_PHONETOSIM2,
Delete菜单:
MITEM1014_PBOOK_MOVE
MENU_MTPNP_PB_MOVE_SIM1TOPHONE,
MENU_MTPNP_PB_MOVE_PHONETOSIM1,
MENU_MTPNP_PB_MOVE_SIM2TOSIM1,
MENU_MTPNP_PB_MOVE_SIM1TOSIM2,
MENU_MTPNP_PB_MOVE_SIM2TOPHONE,
MENU_MTPNP_PB_MOVE_PHONETOSIM2,
二、资源加载和初始化
InitializeAll( )
//加载资源
PopulateResData( )
PopulateMainMenuRes( )
PopulatePbResData( ) //此函数加载的是A卡和B卡的资源(部分B卡资源没有加载)
populateSettingMenu( )
PopulateCmResData( )
PopulateCallHistoryRes( )
#ifdef __MMI_UCM__
UCMResourceData();
#endif
#ifdef __MMI_DUAL_SIM_MASTER__
Mercury_ResPopulate(); //加载B卡的资源
#endif
//初始化设置
InitCallManagement( )
mmi_ucm_init( )
InitCallLogs( )
#ifndef __MMI_DUAL_SIM_DUAL_CALL_SLAVE__
MMI_APP_INIT(mmi_phb_init_protocol()); 设置协议栈函数,初始化全局变量g_phb_cntx
#endif
#ifdef __MMI_UCM__
MMI_APP_INIT(mmi_idle_init_dial_pad_option());
#endif
#if defined(__MMI_DUAL_SIM_MASTER__)
MMI_APP_INIT(MTPNP_PFAL_Init()); 设置B卡菜单的高亮相应函数
MTPNP_PFAL_ADN_Init() 设置B卡电话簿相关菜单的响应函数
SetSlaveProtocolEventHandler(MTPNP_PFAL_ADN_phb_ind_update, PRT_PHB_UPDATE_IND);
猜测:B卡的PHB操作(edit, add, delete),Call History操作都是在MTPNP_PFAL_ADN_phb_ind_update()中处理。
#endif
三、开机获取PHB all entries
当所有电话簿从L4C传送到MMI之后,L4C返回消息:PRT_PHB_STARTUP_FINISH_IND,进入响应:mmi_phb_ind_startup_finish( )。
在单模项目中,这个函数的最后是直接进入mmi_phb_sort_build_name_index()对g_phb_name_index[]进行排序,然后进入
mmi_phb_init_build_lookup_table()装载和排序LookUpTable[]。
但是在6226-DS双模项目中,在mmi_phb_ind_startup_finish( )的最后是进入:mmi_phb_startup_finish_final_step()。此函数会呼叫函数:
MTPNP_PFAL_ADN_Is_PHB_Before_Sort()来判断Slave_g_phb_startup_before_sort的值,
如果为TRUE,表示B卡的电话簿已经获取完毕,然后就可以排序g_phb_name_index[],装载排序LookUpTable[]。
但是此时由于B卡电话簿还没有获取,Slave_g_phb_startup_before_sort = FALSE,因此就直接退出了。
获取B卡PHB entries
L4C2返回消息:XXX(隐藏),进入:
MTPNP_PFAL_ADN_HandleReadSuccessEntry()
store_index = mmi_phb_get_max_pb_sim_entries() + mmi_phb_get_max_pb_phone_entries() + info->record_index - 1;
可见:PhoneBook[]的存储位置是:Phone + SIM A + SIM B
把返回的信息加入到PhoneBook[]中
#if defined(__MMI_PHB_PINYIN_SORT__)
mmi_phb_util_make_pinyin_cache(store_index);
#endif
g_phb_name_index[PhoneBookEntryCount] = index;
PhoneBookEntryCount++;
当B卡的所有电话信息返回到MMI后,L4C2返回消息:XXX(隐藏),进入:
MTPNP_PFAL_ADN_HandleLoadFinish()
g_phb_cntx.refresh_list = MMI_PHB_ENTRY_REFRESH;
PhoneBookEntryCount = MTPNP_PFAL_ADN_GetMasterPhoneCount() + MTPNP_AD_ADN_SIM2GetUsedNumber();
设置一些B卡的PHB信息
if (MTPNP_AD_FDN_GetStatus())
MTPNP_PFAL_ADN_fdn_get_list_to_ram();
else
MTPNP_PFAL_ADN_after_fdn_get_list_to_ram();
MTPNP_PFAL_ADN_after_fdn_get_list_to_ram()
MTPNP_PFAL_ADN_Set_Is_PHB_Before_Sort(MTPNP_TRUE); 设置Slave_g_phb_startup_before_sort=TRUE
mmi_phb_startup_finish_final_step();
此时条件都满足,因此进入mmi_phb_sort_build_name_index();对g_phb_name_index[]排序,然后进入mmi_phb_ind_startup_finish_after_name_sort();装载LookUpTable[]并排序。