本文主要是介绍MTK-call history operate(2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
2008-05-24 | MTK-call history operate(2)
[通话记录]的菜单操作 初始化函数:InitCallLogs() and InitInitCallHistory().
1.未接电话
2.已拨电话
3.已接电话
4.删除通话记录
1.未接电话
2.已拨电话
3.已接电话
4.全部删除
5.通话时间
1.上次通话时间
2.已拨电话总计
3.已接电话总计
4.所有计时归零
6.短信计数器
1.已发送
2.已接收
7.GPRS计数器
1.上次传送
2.上次接收
3.全部传送
4.全部接收
5计数器归零
3种call log的操作大致相同的,这里基本上以拨出电话来学习。注意未接电话一些额外操作
[已拨电话]
HighlightCHISTDialedCalls()
#ifdef __MMI_CH_MIXED_CALL_LOG__
chis_p->isMixedStyle = FALSE;
#endif
ReqReadDialedNumByKey()
ReqReadDialedNumByKey_ext()
if (chis_p->isCallLogReady == TRUE && chis_p->isFirstTime == FALSE) 不是初始化
{
ReqReadDialedNum();
chis_p->isReqSent = TRUE;
}
else
{
SHOW “Processing……”
}
ReqReadDialedNum()
#ifndef __MMI_CH_MIXED_CALL_LOG__
chis_p->dialedCalls = (LOG_CALL*) chis_p->callsLog;
#endif
发送读取消息:PRT_MMI_PHB_GET_LAST_NUMBER_REQ
SetProtocolEventHandler(RspReadDialedNum, PRT_MMI_PHB_GET_LAST_NUMBER_RSP);
RspReadDialedNum()
抽取所有的dialed call log到chis_p->dialedCalls中,实际上存储位置在chis_p->callsLog[]中。
chis_p->nDialedCalls反映当前dialed call log counters
此时,chis_p->ifFirstTime = FALSE
chis_p->isReqSent = FALSE;
EntryCHISTViewDialedCallList(); 进入call list
RegisterHighlightHandler(CHISTGetCurrDialedCallIndex); 高亮响应,主要是设置chis_p->currDialedCallIndex
CHISTPopulateDialedCallList(phoneNumbers, phoneNames); 获取要信息的item以及pop信息
ShowCategory53Screen()
SetKeyHandler(CHISTCallDialedNum, KEY_SEND, KEY_EVENT_DOWN); 拨号
SetKeyHandler(EntryCHISTViewDialedCall, KEY_RIGHT_ARROW, KEY_EVENT_DOWN); 某个call log的详细信息
SetLeftSoftkeyFunction(EntryCHISTViewDialedCall, KEY_EVENT_UP);
按下左软件,进入一个dialed call log的详细信息
日期
时间
姓名(可能没有)
号码
几次
通话时间(可能没有)
EntryCHISTViewDialedCall()
for (i = 0; i < MAX_SUB_MENUS; i++)
{
subMenuDataPtrs[i] = subMenuData[i]; 所有要显示的信息都被拷贝到这里
memset((S8*)subMenuDataPtrs[i], 0, MAX_SUB_MENU_SIZE);
}
把日期,时间,姓名号码,次数,通话时间信息都拷贝到 subMenuDataPtrs[]指针数组中。
ShowCategory84Screen()
SetKeyHandler(CHISTCallDialedNum, KEY_SEND, KEY_EVENT_DOWN);
SetKeyHandler(EntryCHISTDialedListOptions, KEY_RIGHT_ARROW, KEY_EVENT_DOWN);
SetLeftSoftkeyFunction(EntryCHISTDialedListOptions, KEY_EVENT_UP);
进入[已接电话][未接电话]列表的过程大致相同。 注意的是在读取未接电话之后,进入missed call list:
EntryCHISTViewMissedCallList()
if (chis_p->nMissedCallBeforeView != 0)
chis_p->nMissedCallBeforeView = 0;
g_chist_have_missed_call = 0;
mmi_chist_set_have_missed_call();
HideStatusIcon(STATUS_ICON_MISSED_CALL);
UpdateStatusIcons();
在SHOW一个call log的详细信息之后,左软件是进入[选项]。3中类型的call log的选项响应函数虽不相同,但是里面的操作几乎一样。
共6个菜单:删除,保存,拨号,编辑,发送短信,发送彩信。
[删除]
HighlightCHISTDeleteDialedNum()
EntryCHISTDeleteDialedCallConfirm( ) 确认删除?
DisplayConfirm()
SetLeftSoftkeyFunction(CHISTDeleteDialedNum, KEY_EVENT_UP);
按下左软件,确认删除:
void CHISTDeleteDialedNum(void)
{
ReqDeleteCallLog(PHB_LND, chis_p->currDialedCallIndex, 1);
SetProtocolEventHandler(RspDeleteDialedNum, PRT_MMI_PHB_DEL_LAST_NUMBER_RSP);
发送删除消息:PRT_MMI_PHB_DEL_LAST_NUMBER_REQ
return;
}
L4返回消息:PRT_MMI_PHB_DEL_LAST_NUMBER_RSP,进入:
RspDeleteDialedNum()
把被删除的call log之后的所有call log前移一个位置。
chis_p->nDialedCalls --;
此时如果已拨电话的call log全部被删除了,就回到[通话记录]screen,如果还存在dialed call log,就回到已拨电话的call log list SCREEN:SCR8055_CALLS_LIST_DIALED。这个函数 的entry函数是:ReaReadDialedNum( )。也就是重新从NVRAM中读取dialed call log,然后进入dialed call log list。
[保存]
HighlightCHISTSaveDialedNum()
CHISTSaveDialedNum()
chis_p->curCallLogType = PHB_LND;
SaveNumberFromIdleScrn( (S8*) chis_p->dialedCalls[chis_p->currDialedCallIndex].number, MMI_PHB_ENTER_FROM_CALL_LOG);
判断号码的长度,当前电话簿是否准备好。
g_phb_cntx.set_done_flag = 1;
pfnUnicodeStrcpy(pbNumber, number);
memset(pbEmailAddress, 0, ENCODING_LENGTH);
g_phb_enter_from = enter;
mmi_phb_clear_old_history(); //Deletes old PHB screens from history if Phonebook is re-entered thru some other application
//g_phb_cntx.start_scr_id = g_phb_cntx.end_scr_id = 0;
mmi_phb_op_add_pre_entry();
mmi_phb_entry_op_add_choose_storage() //选择存储位置
。。。
保存到电话簿之后,要把姓名同步到call log中。
ReqUpdateCallLogName(PhoneBook[store_index].alpha_id.name_length, PhoneBook[store_index].alpha_id.name_dcs, PhoneBook[store_index].alpha_id.name);
LOG_CALL *record; //定义一个LOG_CALL指针
record = &chis_p->dialedCalls[chis_p->currDialedCallIndex]; //指向当前被保存的call log
把传过来的参数中姓名信息加入到record中。
发送SET消息到L4:PRT_MMI_PHB_SET_LAST_NUMBER_REQ;
SetProtocolEventHandler(RspUpdateCallLogName, PRT_MMI_PHB_SET_LAST_NUMBER_RSP);
//小结:相当于重新保存了一个call log。之前的这个call log在NVRAM中,是没有姓名的,这次保存的是有姓名的,号码相同。 发送保存消息到L4之后,由于号码相同,L4会更新之前保存的那个call log,也就是加上姓名。此时,在MMI中使用的call log:chis_p->dialedCalls中的信息也已经更新了,因为上面的record是指针。因此保存成功后,返回到call log list option以及call log list时,可以看到已经有姓名了。
L4返回消息:PRT_MMI_PHB_SET_LAST_NUMBER_RSP,进入CBack:
RspUpdateCallLogName()
DisplayPopup() //提示保存成功
[拨号]
HighlightCHISTCallDialedNum()
CHISTCallDialedNum()
addToHistory = 0;
chis_p->dialFromCallLog = ITEM_DIALED_CALL;
MakeCall((S8*) chis_p->dialedCalls[chis_p->currDialedCallIndex].number);
[编辑]
HighlightCHISTEditDialedNum()
CHISTEditDialedNum()
pfnUnicodeStrcpy(
g_idle_context.DialPadCallBuffer, (S8*) chis_p->dialedCalls[chis_p->currDialedCallIndex].number); g_idle_context.LongPressEnable = 1;
IdleScreenDigitHandler();
[发送短信]
HighlightCHISTSendSMSDialedNum()
CHISTSendSMSDialedNum()
mmi_msg_set_phb_send_case(MMI_SEND_SMS_FROM_PHB);
获取call log中的姓名和号码
mmi_msg_get_number_from_phb((U8*)name, (U8*)number);
[发送彩信]
HighlightCHISTSendMMSDialedNum()
CHISTSendMMSDialedNum()
获取号码
mms_address_insert_hdlr((char*)number);
[删除通话记录]初始化函数:InitCallsReset()
HighlightCHISTDeleteAllDialed()
chis_p->isDeleteAll = FALSE; 不是删除所有
if (chis_p->nDialedCalls != 0)
{
ChangeLeftSoftkey(STR_GLOBAL_OK, IMG_GLOBAL_OK);
SetLeftSoftkeyFunction(EntryCHISTDeleteAllDialedConfirm, KEY_EVENT_UP);
}
else 没有拨出电话log
{
ChangeLeftSoftkey(0, 0);
SetLeftSoftkeyFunction(NULL,KEY_EVENT_UP);
}
EntryCHISTDeleteAllDialedConfirm() 询问是否删除?
DisplayConfirm()
DeleteAllDialedCalls() //确定删除
与删除一个call log的唯一区别是:发送消息中的index不同。这里index = 0xff,删除一个call log时,index = currDialedCallIndex。
发送的消息:PRT_MMI_PHB_DEL_LAST_NUMBER_REQ
SetProtocolEventHandler(RspDeleteAllDialedNum, PRT_MMI_PHB_DEL_LAST_NUMBER_RSP);
L4返回消息: PRT_MMI_PHB_DEL_LAST_NUMBER_RSP,进入CBACK:
RspDeleteAllDialedNum( )
chis_p->nDialedCalls = 0;
if (chis_p->isDeleteAll == TRUE)
{
if (chis_p->nMissedCalls != 0)
{
DeleteAllMissedCalls();
return;
}
else if (chis_p->nRecvdCalls != 0)
{
DeleteAllRecdCalls();
return;
}
chis_p->isDeleteAll = FALSE;
}
DisplayPopup()
删除[未接电话][已接电话]的处理过程大致相同。
[全部删除]:删除过程是[已拨电话]—>[未接电话]à[已接电话]。
HighlightCHISTDeleteAllLogs()
chis_p->isDeleteAll = TRUE;
DeleteAllDialedCalls()
RspDeleteAllDialedNum()
DeleteAllMissedCalls()
RspDeleteAllMissedNum()
DeleteAllRecdCalls()
RspDeleteAllRecvdNum()
删除的过程与读取call log的机制有点类似。
[通话时间]
进入[通话时间]菜单:
EntryCHISTCallTime()
//首先读取通话时间
ReadRecord(NVRAM_EF_CALL_TIME_LID, 1, (void*)&chis_p->last_call_time, sizeof(MYTIME), &error);
ReadRecord(NVRAM_EF_CALL_TIME_LID, 2, (void*)&chis_p->total_out_time, sizeof(MYTIME), &error);
ReadRecord(NVRAM_EF_CALL_TIME_LID, 3, (void*)&chis_p->total_in_time, sizeof(MYTIME), &error);
ShowCategory52Screen()
3个菜单:[上次通话时间[已拨电话总计][已接电话总结]都没有操作,仅仅是显示POP信息。
[所有计时归零]
HighlightCHISTResetAllTime()
if (CHISTNeedToResetTimes() == 0) //判断是否需要reset。
{
ChangeLeftSoftkey(0, 0);
SetLeftSoftkeyFunction(NULL, KEY_EVENT_UP);
}
else
{
ChangeLeftSoftkey(STR_GLOBAL_OK, IMG_GLOBAL_OK);
SetLeftSoftkeyFunction(EntryCHISTResetAllTimeConfirm, KEY_EVENT_UP);
}
CHISTResetAllTime() //确定删除所有的call log
memset(&chis_p->last_call_time, 0, sizeof(MYTIME));
memset(&chis_p->last_out_time, 0, sizeof(MYTIME));
memset(&chis_p->last_in_time, 0, sizeof(MYTIME));
//写入NVRAM
WriteRecord(NVRAM_EF_CALL_TIME_LID, 1, (void*)&chis_p->last_call_time, sizeof(MYTIME), &error);
WriteRecord(NVRAM_EF_CALL_TIME_LID, 2, (void*)&chis_p->total_out_time, sizeof(MYTIME), &error);
WriteRecord(NVRAM_EF_CALL_TIME_LID, 3, (void*)&chis_p->total_in_time, sizeof(MYTIME), &error);
DisplayPopup()
[短信计数器]
在初始化时,InitSMSCounter(),call InitNvramSMSCounters()从NVRAM中读取发送和接收的短信数目:
ReadValue(NVRAM_SMSCOUNTERS_SENT_SHORT, &chis_p->nSendSMSCount, DS_SHORT, &error);
ReadValue(NVRAM_SMSCOUNTERS_RECD_SHORT, &chis_p->nRecvSMSCount, DS_SHORT, &error);
这篇关于MTK-call history operate(2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!