搜索和选择联系人

  • Post author:
  • Post category:其他


相关类

packages/apps/Contacts/src/com/android/contacts/activities/ActionBarAdapter.java

packages/apps/Contacts/src/com/android/contacts/list/ContactEntryListFragment.java

packages/providers/ContactsProvider/src/com/android/providers/contacts/NameNormalizer.java

搜索和选择联系人模式切换流程

搜索联系人和选择联系人都在ActionBarAdapter类中发起

ActionBarAdapter.Listener中定义了onAction()和onUpButtonPressed()方法进行搜索和选择联系人的监听

ActionBarAdapter.Listener.Action中定义了对联系人列表的一系列操作模式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

public interface Listener {


public abstract class Action {


//当搜文本索框文字发生改变,触发此Action,根据输入文字进行联系人查询筛选

public static final int CHANGE_SEARCH_QUERY = 0;

//开启搜索联系人模式,调整界面,显示搜索框和搜索界面,进入搜索模式

public static final int START_SEARCH_MODE = 1;

//开启选择联系人模式,调整界面,显示选择框组件,进入选择模式

public static final int START_SELECTION_MODE = 2;

//关闭搜索或选择模式,恢复界面到联系人列表

public static final int STOP_SEARCH_AND_SELECTION_MODE = 3;

//关闭搜索或选择模式,运行tab按钮动画

public static final int BEGIN_STOPPING_SEARCH_AND_SELECTION_MODE = 4;

}

//发送启动模式Action,启动搜索或选择模式

void onAction(int action);

//返回按钮监听,取消搜索或选择模式

void onUpButtonPressed();

}

搜索联系人主要是CHANGE_SEARCH_QUERY动作发起,由代码调用跟到ContactEntryListFragment类中的setQueryString()方法,在此处设置全局查询关键词,并调用了reloadData()方法进行数据搜索

1

2

3

4

5

6

7

8

9

10

11

12

// TODO: the paramter delaySelection is not in use, and let’s remove it.

public void setQueryString(String queryString, boolean delaySelection) {


if (!TextUtils.equals(mQueryString, queryString)) {


……

if (mAdapter != null) {


//设置搜索关键词

mAdapter.setQueryString(queryString);

//启动加载器开始加载联系人数据

reloadData();

}

}

}

搜索联系人ContactsProvider调用流程

加载器调用ContactsProvider搜索联系人调用使用了ContactsProvider2.query()方法,使用的Uri是Contacts.ENTERPRISE_CONTENT_FILTER_URI

创建联系人的时候在contacts2.db数据库中的name_lookup表中存储了normallized_name列,该列中的数据来源是NameNormalize.normalize()对displayname的转换

搜索联系人时主要通过normallized_name列数据进行模糊匹配,此方法中的转换算法和匹配算法可自行研究

1

2

3

4

5

6

7

8

/**

* Converts the supplied name to a string that can be used to perform approximate matching

* of names. It ignores non-letter, non-digit characters, and removes accents.

*/

public static String normalize(String name) {


CollationKey key = getCompressingCollator().getCollationKey(lettersAndDigitsOnly(name));

return Hex.encodeHex(key.toByteArray(http://www.amjmh.com), true);

}

SIM卡联系人操作

相关类

frameworks/opt/telephony/src/java/com/android/internal/telephony/IccProvider.java

frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/UiccController.java

————————————————

转载于:https://www.cnblogs.com/ly570/p/11414324.html