联系人数据库设计之PhotoPriorityResolver
2013-06-27 10:35
225 查看
转载请注明地址:http://blog.csdn.net/droyon/article/details/9185437
联系人数据库设计代码分析,源代码下载请访问android官网
联系人数据库设计代码分析,源代码下载请访问android官网
package com.android.providers.contacts; import com.android.internal.util.XmlUtils; import com.google.android.collect.Maps; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import android.accounts.AccountManager; import android.accounts.AuthenticatorDescription; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ServiceInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.XmlResourceParser; import android.util.Log; import java.io.IOException; import java.util.HashMap; /** * Maintains a cache of photo priority per account type. During contact aggregation * photo with a higher priority is chosen for the the entire contact, barring an * explicit override by the user, which is captured as the is_superprimary flag * on the photo itself. * 为每一个accountType保持一个photo priority缓冲。在整个联系期间,选择优先级较高的photo。 * 用户显式重写,用于photo的is_superprimary标志 */ public class PhotoPriorityResolver { private static final String TAG = "PhotoPriorityResolver"; public static final int DEFAULT_PRIORITY = 7; /** * Meta-data key for the contacts configuration associated with a sync service. * 联系人配置的Metadata关键字和syncService相关 */ private static final String METADATA_CONTACTS = "android.provider.CONTACTS_STRUCTURE"; /** * The XML tag capturing the picture priority. The syntax is: * <code><Picture android:priority="6"/></code> */ private static final String PICTURE_TAG = "Picture"; /** * Name of the attribute of the Picture tag capturing the priority itself. */ private static final String PRIORITY_ATTR = "priority"; private Context mContext; private HashMap<String, Integer> mPhotoPriorities = Maps.newHashMap(); public PhotoPriorityResolver(Context context) { mContext = context; } /** * Returns the photo priority for the specified account type. Maintains cache * of photo priorities. * 为指定account_typt返回photo priority */ public synchronized int getPhotoPriority(String accountType) { if (accountType == null) { return DEFAULT_PRIORITY; } Integer priority = mPhotoPriorities.get(accountType); if (priority == null) { priority = resolvePhotoPriority(accountType); mPhotoPriorities.put(accountType, priority); } return priority; } /** * Finds photo priority for the specified account type. * 为指定account_type返回photo priority */ private int resolvePhotoPriority(String accountType) { final AccountManager am = AccountManager.get(mContext); for (AuthenticatorDescription auth : am.getAuthenticatorTypes()) { if (accountType.equals(auth.type)) { return resolvePhotoPriorityFromMetaData(auth.packageName); } } return DEFAULT_PRIORITY; } /** * Finds the meta-data XML containing the contacts configuration and * reads the picture priority from that file. * 返回指定packageName的含有meta-Data 联系人配置的XML文件,读取其中picture priority属性 */ /* package */ int resolvePhotoPriorityFromMetaData(String packageName) { final PackageManager pm = mContext.getPackageManager(); try { PackageInfo pi = pm.getPackageInfo(packageName, PackageManager.GET_SERVICES | PackageManager.GET_META_DATA); if (pi != null && pi.services != null) { for (ServiceInfo si : pi.services) { final XmlResourceParser parser = si.loadXmlMetaData(pm, METADATA_CONTACTS); if (parser != null) { return loadPhotoPriorityFromXml(mContext, parser); } } } } catch (NameNotFoundException e) { Log.w(TAG, "Problem loading photo priorities: " + e.toString()); } return DEFAULT_PRIORITY; } /** * 读取xml文件内容,解析picture priority属性 * @param context * @param parser * @return */ private int loadPhotoPriorityFromXml(Context context, XmlPullParser parser) { int priority = DEFAULT_PRIORITY; try { int type; while ((type = parser.next()) != XmlPullParser.START_TAG && type != XmlPullParser.END_DOCUMENT) { // Drain comments and whitespace } if (type != XmlPullParser.START_TAG) { throw new IllegalStateException("No start tag found"); } final int depth = parser.getDepth(); while (((type = parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) { String name = parser.getName(); if (type == XmlPullParser.START_TAG && PICTURE_TAG.equals(name)) { int attributeCount = parser.getAttributeCount(); for (int i = 0; i < attributeCount; i++) { String attr = parser.getAttributeName(i); if (PRIORITY_ATTR.equals(attr)) { priority = XmlUtils.convertValueToInt(parser.getAttributeValue(i), DEFAULT_PRIORITY); } else { throw new IllegalStateException("Unsupported attribute " + attr); } } } } } catch (XmlPullParserException e) { throw new IllegalStateException("Problem reading XML", e); } catch (IOException e) { throw new IllegalStateException("Problem reading XML", e); } return priority; } }
相关文章推荐
- 联系人数据库设计之ContactsTransaction
- 联系人数据库设计之AbstractContactsProvider
- 联系人数据库设计之ContactsTransaction
- IM实现联系人及联系人分组的数据库设计
- 联系人数据库设计之AbstractContactsProvider
- 数据库设计与web应用的性能之间有何关系
- 开发宝典:数据库设计技巧
- 数据库连接、设计以及备份技巧集锦
- Android数据库设计
- 初学者需要掌握的数据库设计词汇对照表(二)
- 数据库表扩展字段设计思路
- Android:联系人Contacts之ContentResolver query 参数详解
- [导入]数据库应用系统设计面临的常见的大的方面的问题?
- 怎么设计一个好的数据库
- 使用silverlight构建一个工作流设计器(十八)-持久化数据到数据库—服务器段功能实现
- 数据库设计三大范式
- 3种高效的Tags标签系统数据库设计…
- 数据库设计
- mysql数据库设计学习---数据库设计规范化的五个要求
- 浅谈数据库用户表结构设计,第三方登录