MTK-call history operate(2)

来源:互联网 发布:女超人知乎 编辑:程序博客网 时间:2024/05/22 10:44

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 logNVRAM中,是没有姓名的,这次保存的是有姓名的,号码相同。 发送保存消息到L4之后,由于号码相同,L4会更新之前保存的那个call log,也就是加上姓名。此时,在MMI中使用的call logchis_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);

原创粉丝点击