联系人数据库设计之PhotoPriorityResolver

来源:互联网 发布:ubuntu 中文界面 编辑:程序博客网 时间:2024/06/11 22:01

转载请注明地址:http://blog.csdn.net/droyon/article/details/9185437

联系人数据库设计代码分析,源代码下载请访问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;    }}