搜索和选择联系人

相关类
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