MTK-Phonebook bootup(3)

来源:互联网 发布:js中list删除元素 编辑:程序博客网 时间:2024/06/05 06:35

四、删除一个entry从Phone List中删除一个entry。

mmi_phb_entry_op_option_sim()

       ShowCategory15Screen()

 

选择[删除],SetHiliteHandler(MITEM1012_PBOOK_DELETE, mmi_phb_highlight_op_delete_entry);

       mmi_phb_entry_op_delete_confirm()      //是否删除?

              mmi_phb_op_delete_entry_req()      //删除

                     mmi_phb_show_in_progress(STR_PHB_DELETING, IMG_GLOBAL_DELETED); //显示“正在处理”信息

               store_index = g_phb_name_index[g_phb_cntx.active_index];            //获取这个entry在PhoneBook[]中的存储位置

                     myMsgPtr->index = (storage == MMI_SIM) ? (store_index + 1) - MAX_PB_PHONE_ENTRIES : (store_index + 1);       //entry在L4中存储位置

                     发送消息:PRT_PHB_DEL_ENTRY_REQ到L4.

                     SetProtocolEventHandler(mmi_phb_op_delete_entry_rsp, PRT_PHB_DEL_ENTRY_RSP);      //设置CBack函数

                     调整histroy screen。

 

L4返回消息:

mmi_phb_op_delete_entry_rsp()

      if (localPtr->result.flag == 0 /* OK */ )

       {

              PhbUpdateSpeedDial(storage, record_index, MMI_PHB_PHONEBOOK, NULL, NULL);  //根据NVRAM的存储位置record_index,更新速拨信息。(速拨信息中也保存                                                                                                                                             record_index信息。)

              if (store_index >= MAX_PB_PHONE_ENTRIES)       //删除的entry是SIM卡中号码

              {

                     g_phb_cntx.sim_used--;

              }

              else                //删除的是ME中号码

              {

                     g_phb_cntx.phone_used--;

                     删除optional IDs.

                     删除video.

                     删除生日。

 

                     deletedCnt = mmi_phb_op_clear_lookup_table_by_index(store_index);      设置LookUpTable[]中number = 1000000000(无效号码)

                     if (deletedCnt)

               {

                   mmi_phb_lookup_table_sort();             //对LookUpTable[]重新排序

                   g_phb_cntx.lookup_table_count -= deletedCnt;

               }

 

                     mmi_phb_op_delete_update_index(store_index); 

                            for (pos = 0; pos < PhoneBookEntryCount; pos++)

                         {

                             if (g_phb_name_index[pos] == store_index)

                             {

                                 PhoneBookEntryCount--;                    //总的phone entries递减

                                 break;

                             }

                         }

                         for (i = pos; i < PhoneBookEntryCount; i++)       //调整g_phb_name_index[]中的索引位置。

                         {

                             g_phb_name_index[i] = g_phb_name_index[i + 1];

                         }

                            //注意:这里并没有清除PhoneBook[store_index]中的内容。因为在对phone entries进行操作时,不是直接操作PhoneBook[]的,而是通过索引的。

                            //另外:在上面的存储一个entry时,在把姓名和号码保存到PhoneBook[]时,并没有在PhoneBook[]中查找一个空的位置来存储,所使用的stort_index是从                            L4传过来的。也就是:在保存一个entry到L4时,在CBack函数中,L4会返回一个存储位置:record_index,然后store_index = record_index – 1。

              }

       }

       else        //删除失败

       {

 

       }

 

 

五、快速查找

思路是:第一次进入快速查找时,SHOW出所有的entry。用户输入一个字母后,输入的字母与所有的entries的前2个字节比较,如果符合的话,就把该entry增加到一个指针数组中。用户输入第二个字母后,再把输入的所有字母与所有的entries比较,再次设置指针。。。。。。

 

mmi_phb_quick_search_list_pre_entry()

 

       //注意这2个函数:第一个是MTK的快速查询,第二个是进入百家姓

       mmi_phb_entry_quick_search_list()   

       mmi_phb_entry_quick_search_list_ex()

 

mmi_phb_entry_quick_search_list()

       RegisterCat200SearchFunction(mmi_phb_quick_search_find_entry);

       ShowCategory200Screen();

       mmi_phb_quick_search_make_cache();   //把PhoneBook[]中的entries姓名第一个字母,放入g_phb_qsearch_cache[]中。(前2个字节)

 

当用户输入一个字母如:a,进入:

Cat200multitap_inputcallback(UI_character_type inp)    //inp=’a’

       if (inp != 0)

    {

        gui_single_line_input_box_insert_multitap_character(&MMI_singleline_inputbox, inp); //把’a’插入MMI_singleline_inputbox中。

    }

       if (!gui_single_line_input_box_test_overflow(&MMI_singleline_inputbox))                      //判断输入是否溢出

       {

              if (cat200_search_function)        //上面注册的函数

        {

            no_entries = cat200_search_function(MMI_singleline_inputbox.text);//输入的字母与PhoneBook[]中比较,过滤,设置g_phb_qsearch[]

            load_dynamic_item_buffer(no_entries);                                           //根据g_phb_qsearch[]的值,动态获取匹配的entry

 

            if (no_entries >= 0)

            {

                refresh_search_list_change_list(no_entries);

            }

            singleline_inputbox_input_callback();

            redraw_singleline_inputbox();

            gdi_layer_blt_previous(0, 0, UI_device_width - 1, UI_device_height - 1);

 

        }

       }

 

小结:

1.Show 出所有的entries,最下面供用户输入,设置g_phb_qsearch[]全部为1

2.用户输入第一个字母。把这个字母与所有entries的首字母比较。若相等,设置g_phb_qsearch[i]=1;否则g_phb_qsearch[i]=0

      然后重新获取所有g_phb_qsearch[i]=1entries,并show list

3.用户输入第二个字母。把这2个输入的字母与所有的entries比较。若相等,设置g_phb_qsearch[i]=1;否则g_phb_qsearch[i]=0

      然后重新获取所有g_phb_qsearch[i]=1entries,并show list

4.如此继续。。。。。。

5.当删除一个字母时,所做的操作相同。

 

 

六、姓名查找

mmi_phb_highlight_search_name()

       mmi_phb_search_name_pre_entry()

              if (PhoneBookEntryCount)

       {

              mmi_phb_entry_search_name();

                            ShowCategory5Screen_ext();    //接收用户输入姓名:pbName。

                            SetLeftSoftkeyFunction(mmi_phb_entry_search_name_option, KEY_EVENT_UP);

       }

 

左软件选项:

mmi_phb_entry_search_name_option()

       ShowCategory15Screen();  //2个选择:[查找]           mmi_phb_highlight_search_name_option_search()

                                                                             [输入法]       mmi_phb_highlight_search_name_option_input_method()

 

1.输入法相关知识

EntryInputMethodScreen()

       ShowCategory15Screen()

 

左软件响应:

InputMethodScreenHandleLSK()

       S32 index = GetHighlightedItem();

       currPreFuncPtr = preHandleInputMethodLSKFuncPtrs[index];         

       currPostFuncPtr = postHandleInputMethodLSKFuncPtrs[index];

       if (currPreFuncPtr != NULL)

    {

        (*currPreFuncPtr) ();

    }

    if (currPostFuncPtr != NULL)

    {

        (*currPostFuncPtr) ();

    }

 

2.查找

mmi_phb_search_name()

       g_phb_cntx.highlight_entry = mmi_phb_search_name_find_closet();          //查找到的应该高亮的entry

       mmi_phb_list_pre_entry();       //动态show所有的entries。

              mmi_phb_entry_list(       PhoneBookEntryCount,             /* Total Entry */

                           STR_SCR_PBOOK_VIEW_CAPTION,      /* Title String */

                           IMG_SCR_PBOOK_CAPTION,           /* Title Image */

                           STR_GLOBAL_OPTIONS,              /* LSK */

                           IMG_GLOBAL_OPTIONS,              /* LSK */

                                                    #if defined(__MMI_INTELLIGENT_CALL_ALERT__)

                           mmi_phb_get_index_speak_name,

                                                    #else

                           mmi_phb_get_index,               /* Highlight Callback */

                                                   #endif

                           mmi_phb_entry_op_option,         /* LSK Callback */

                           send_key_ptr,                    /* SEND Key Callback */

                           mmi_phb_list_get_item,           /* List Callback */

                           mmi_phb_list_get_hint,           /* Hint Callback */

                           mmi_phb_list_pre_entry,          /* Re-Entry Callback */

                           TRUE,                            /* Alpha Index */

                           TRUE);                           /* Right Arrow Key */

                     ShowCategory184Screen(

            STR_TITLE,

            IMG_TITLE,

            STR_LSK,

            IMG_LSK,

            STR_GLOBAL_BACK,

            IMG_GLOBAL_BACK,

            EntryCount,

            ItemPtr,

            HintPtr,

                  g_phb_cntx.highlight_entry,

            guiBuffer);

 

如何根据姓名查找:

mmi_phb_search_name_find_closet()

       if (pfnUnicodeStrlen((S8*) pbName) == 0)

    {

        return 0;

    }

       result_index = mmi_phb_search_name_binary_search(0, (PhoneBookEntryCount - 1), (S8*) pbName);

             

//find the position of ucs2_name in the array g_phb_name_index[] between low and high;

mmi_phb_search_name_binary_search()

       输入的姓名与PhoneBook[]中的姓名比较,直到找出一个合适的entry作为高亮。