1e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton/*
2e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Copyright (C) 2009 The Android Open Source Project
3e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton *
4e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Licensed under the Apache License, Version 2.0 (the "License");
5e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * you may not use this file except in compliance with the License.
6e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * You may obtain a copy of the License at
7e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton *
8e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton *      http://www.apache.org/licenses/LICENSE-2.0
9e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton *
10e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Unless required by applicable law or agreed to in writing, software
11e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * distributed under the License is distributed on an "AS IS" BASIS,
12e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * See the License for the specific language governing permissions and
14e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * limitations under the License.
15e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */
16e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
17e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonpackage com.android.loaderapp;
18e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
19e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.Manifest;
20e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.content.AsyncQueryHandler;
21e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.content.ContentResolver;
22e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.content.ContentUris;
23e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.content.ContentValues;
24e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.content.Context;
25e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.content.pm.PackageManager;
26e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.content.pm.PackageManager.NameNotFoundException;
27e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.content.res.Resources;
28e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.content.res.Resources.NotFoundException;
29e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.database.Cursor;
30e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.graphics.Bitmap;
31e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.graphics.BitmapFactory;
32e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.net.Uri;
33e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.os.SystemClock;
34e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.provider.ContactsContract.Contacts;
35e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.provider.ContactsContract.Data;
36e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.provider.ContactsContract.PhoneLookup;
37e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.provider.ContactsContract.RawContacts;
38e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.provider.ContactsContract.StatusUpdates;
39e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.provider.ContactsContract.CommonDataKinds.Email;
40e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.provider.ContactsContract.CommonDataKinds.Photo;
41e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.text.TextUtils;
42e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.text.format.DateUtils;
43e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.util.AttributeSet;
44e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.util.Log;
45e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.view.LayoutInflater;
46e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.view.View;
47e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.widget.CheckBox;
48e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.widget.QuickContactBadge;
49e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.widget.FrameLayout;
50e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.widget.ImageView;
51e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.widget.TextView;
52e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
53e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton/**
54e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Header used across system for displaying a title bar with contact info. You
55e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * can bind specific values on the header, or use helper methods like
56e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * {@link #bindFromContactLookupUri(Uri)} to populate asynchronously.
57e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * <p>
58e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * The parent must request the {@link Manifest.permission#READ_CONTACTS}
59e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * permission to access contact data.
60e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */
61e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonpublic class ContactHeaderWidget extends FrameLayout implements View.OnClickListener {
62e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
63e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private static final String TAG = "ContactHeaderWidget";
64e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
65e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private TextView mDisplayNameView;
66e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private View mAggregateBadge;
67e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private TextView mPhoneticNameView;
68e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private CheckBox mStarredView;
69e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private QuickContactBadge mPhotoView;
70e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private ImageView mPresenceView;
71e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private TextView mStatusView;
72e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private TextView mStatusAttributionView;
73e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private int mNoPhotoResource;
74e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private QueryHandler mQueryHandler;
75e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
76e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    protected Uri mContactUri;
77e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
78e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    protected String[] mExcludeMimes = null;
79e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
80e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    protected ContentResolver mContentResolver;
81e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
82e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
83e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * Interface for callbacks invoked when the user interacts with a header.
84e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
85e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public interface ContactHeaderListener {
86e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        public void onPhotoClick(View view);
87e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        public void onDisplayNameClick(View view);
88e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
89e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
90e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private ContactHeaderListener mListener;
91e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
92e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
93e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private interface ContactQuery {
94e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        //Projection used for the summary info in the header.
95e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        String[] COLUMNS = new String[] {
96e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            Contacts._ID,
97e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            Contacts.LOOKUP_KEY,
98e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            Contacts.PHOTO_ID,
99e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            Contacts.DISPLAY_NAME,
100e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            Contacts.PHONETIC_NAME,
101e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            Contacts.STARRED,
102e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            Contacts.CONTACT_PRESENCE,
103e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            Contacts.CONTACT_STATUS,
104e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            Contacts.CONTACT_STATUS_TIMESTAMP,
105e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            Contacts.CONTACT_STATUS_RES_PACKAGE,
106e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            Contacts.CONTACT_STATUS_LABEL,
107e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        };
108e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        int _ID = 0;
109e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        int LOOKUP_KEY = 1;
110e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        int PHOTO_ID = 2;
111e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        int DISPLAY_NAME = 3;
112e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        int PHONETIC_NAME = 4;
113e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        //TODO: We need to figure out how we're going to get the phonetic name.
114e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        //static final int HEADER_PHONETIC_NAME_COLUMN_INDEX
115e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        int STARRED = 5;
116e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        int CONTACT_PRESENCE_STATUS = 6;
117e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        int CONTACT_STATUS = 7;
118e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        int CONTACT_STATUS_TIMESTAMP = 8;
119e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        int CONTACT_STATUS_RES_PACKAGE = 9;
120e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        int CONTACT_STATUS_LABEL = 10;
121e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
122e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
123e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private interface PhotoQuery {
124e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        String[] COLUMNS = new String[] {
125e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            Photo.PHOTO
126e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        };
127e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
128e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        int PHOTO = 0;
129e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
130e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
131e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    //Projection used for looking up contact id from phone number
132e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    protected static final String[] PHONE_LOOKUP_PROJECTION = new String[] {
133e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        PhoneLookup._ID,
134e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        PhoneLookup.LOOKUP_KEY,
135e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    };
136e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    protected static final int PHONE_LOOKUP_CONTACT_ID_COLUMN_INDEX = 0;
137e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    protected static final int PHONE_LOOKUP_CONTACT_LOOKUP_KEY_COLUMN_INDEX = 1;
138e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
139e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    //Projection used for looking up contact id from email address
140e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    protected static final String[] EMAIL_LOOKUP_PROJECTION = new String[] {
141e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        RawContacts.CONTACT_ID,
142e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        Contacts.LOOKUP_KEY,
143e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    };
144e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    protected static final int EMAIL_LOOKUP_CONTACT_ID_COLUMN_INDEX = 0;
145e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    protected static final int EMAIL_LOOKUP_CONTACT_LOOKUP_KEY_COLUMN_INDEX = 1;
146e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
147e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    protected static final String[] CONTACT_LOOKUP_PROJECTION = new String[] {
148e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        Contacts._ID,
149e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    };
150e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    protected static final int CONTACT_LOOKUP_ID_COLUMN_INDEX = 0;
151e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
152e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private static final int TOKEN_CONTACT_INFO = 0;
153e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private static final int TOKEN_PHONE_LOOKUP = 1;
154e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private static final int TOKEN_EMAIL_LOOKUP = 2;
155e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private static final int TOKEN_PHOTO_QUERY = 3;
156e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
157e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public ContactHeaderWidget(Context context) {
158e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        this(context, null);
159e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
160e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
161e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public ContactHeaderWidget(Context context, AttributeSet attrs) {
162e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        this(context, attrs, 0);
163e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
164e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
165e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public ContactHeaderWidget(Context context, AttributeSet attrs, int defStyle) {
166e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        super(context, attrs, defStyle);
167e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
168e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mContentResolver = mContext.getContentResolver();
169e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
170e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        LayoutInflater inflater =
171e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
172e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        inflater.inflate(R.layout.contact_header, this);
173e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
174e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mDisplayNameView = (TextView) findViewById(R.id.name);
175e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
176e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mPhoneticNameView = (TextView) findViewById(R.id.phonetic_name);
177e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
178e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mPhotoView = (QuickContactBadge) findViewById(R.id.photo);
179e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
180e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mPresenceView = (ImageView) findViewById(R.id.presence);
181e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
182e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mStatusView = (TextView)findViewById(R.id.status);
183e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mStatusAttributionView = (TextView)findViewById(R.id.status_date);
184e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
185e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        // Set the photo with a random "no contact" image
186e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        long now = SystemClock.elapsedRealtime();
187e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        int num = (int) now & 0xf;
188e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        if (num < 9) {
189e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            // Leaning in from right, common
190e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            mNoPhotoResource = R.drawable.ic_contact_picture;
191e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        } else if (num < 14) {
192e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            // Leaning in from left uncommon
193e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            mNoPhotoResource = R.drawable.ic_contact_picture_2;
194e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        } else {
195e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            // Coming in from the top, rare
196e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            mNoPhotoResource = R.drawable.ic_contact_picture_3;
197e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        }
198e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
199e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        resetAsyncQueryHandler();
200e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
201e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
202e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public void enableClickListeners() {
203e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mDisplayNameView.setOnClickListener(this);
204e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mPhotoView.setOnClickListener(this);
205e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
206e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
207e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
208e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * Set the given {@link ContactHeaderListener} to handle header events.
209e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
210e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public void setContactHeaderListener(ContactHeaderListener listener) {
211e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mListener = listener;
212e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
213e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
214e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private void performPhotoClick() {
215e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        if (mListener != null) {
216e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            mListener.onPhotoClick(mPhotoView);
217e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        }
218e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
219e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
220e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private void performDisplayNameClick() {
221e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        if (mListener != null) {
222e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            mListener.onDisplayNameClick(mDisplayNameView);
223e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        }
224e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
225e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
226e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private class QueryHandler extends AsyncQueryHandler {
227e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
228e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        public QueryHandler(ContentResolver cr) {
229e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            super(cr);
230e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        }
231e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
232e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        @Override
233e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
234e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            try{
235e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                if (this != mQueryHandler) {
236e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    Log.d(TAG, "onQueryComplete: discard result, the query handler is reset!");
237e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    return;
238e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                }
239e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
240e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                switch (token) {
241e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    case TOKEN_PHOTO_QUERY: {
242e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        //Set the photo
243e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        Bitmap photoBitmap = null;
244e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        if (cursor != null && cursor.moveToFirst()
245e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                                && !cursor.isNull(PhotoQuery.PHOTO)) {
246e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            byte[] photoData = cursor.getBlob(PhotoQuery.PHOTO);
247e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            photoBitmap = BitmapFactory.decodeByteArray(photoData, 0,
248e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                                    photoData.length, null);
249e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        }
250e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
251e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        if (photoBitmap == null) {
252e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            photoBitmap = loadPlaceholderPhoto(null);
253e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        }
254e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        setPhoto(photoBitmap);
255e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        if (cookie != null && cookie instanceof Uri) {
256e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            mPhotoView.assignContactUri((Uri) cookie);
257e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        }
258e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        invalidate();
259e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        break;
260e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    }
261e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    case TOKEN_CONTACT_INFO: {
262e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        if (cursor != null && cursor.moveToFirst()) {
263e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            bindContactInfo(cursor);
264e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            final Uri lookupUri = Contacts.getLookupUri(
265e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                                    cursor.getLong(ContactQuery._ID),
266e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                                    cursor.getString(ContactQuery.LOOKUP_KEY));
267e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
268e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            final long photoId = cursor.getLong(ContactQuery.PHOTO_ID);
269e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
270e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            setPhotoId(photoId, lookupUri);
271e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        } else {
272e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            // shouldn't really happen
273e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            setDisplayName(null, null);
274e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            setSocialSnippet(null);
275e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            setPhoto(loadPlaceholderPhoto(null));
276e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        }
277e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        break;
278e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    }
279e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    case TOKEN_PHONE_LOOKUP: {
280e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        if (cursor != null && cursor.moveToFirst()) {
281e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            long contactId = cursor.getLong(PHONE_LOOKUP_CONTACT_ID_COLUMN_INDEX);
282e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            String lookupKey = cursor.getString(
283e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                                    PHONE_LOOKUP_CONTACT_LOOKUP_KEY_COLUMN_INDEX);
284e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            bindFromContactUriInternal(Contacts.getLookupUri(contactId, lookupKey),
285e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                                    false /* don't reset query handler */);
286e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        } else {
287e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            String phoneNumber = (String) cookie;
288e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            setDisplayName(phoneNumber, null);
289e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            setSocialSnippet(null);
290e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            setPhoto(loadPlaceholderPhoto(null));
291e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            mPhotoView.assignContactFromPhone(phoneNumber, true);
292e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        }
293e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        break;
294e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    }
295e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    case TOKEN_EMAIL_LOOKUP: {
296e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        if (cursor != null && cursor.moveToFirst()) {
297e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            long contactId = cursor.getLong(EMAIL_LOOKUP_CONTACT_ID_COLUMN_INDEX);
298e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            String lookupKey = cursor.getString(
299e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                                    EMAIL_LOOKUP_CONTACT_LOOKUP_KEY_COLUMN_INDEX);
300e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            bindFromContactUriInternal(Contacts.getLookupUri(contactId, lookupKey),
301e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                                    false /* don't reset query handler */);
302e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        } else {
303e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            String emailAddress = (String) cookie;
304e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            setDisplayName(emailAddress, null);
305e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            setSocialSnippet(null);
306e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            setPhoto(loadPlaceholderPhoto(null));
307e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            mPhotoView.assignContactFromEmail(emailAddress, true);
308e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        }
309e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                        break;
310e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    }
311e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                }
312e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            } finally {
313e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                if (cursor != null) {
314e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    cursor.close();
315e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                }
316e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            }
317e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        }
318e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
319e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
320e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
321e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * Manually set the presence.
322e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
323e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public void setPresence(int presence) {
324e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mPresenceView.setImageResource(StatusUpdates.getPresenceIconResourceId(presence));
325e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
326e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
327e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
328e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * Manually set the presence. If presence is null, it is hidden.
329e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * This doesn't change the underlying {@link Contacts} value, only the UI state.
330e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * @hide
331e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
332e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public void setPresence(Integer presence) {
333e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        if (presence == null) {
334e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            showPresence(false);
335e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        } else {
336e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            showPresence(true);
337e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            setPresence(presence.intValue());
338e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        }
339e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
340e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
341e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
342e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * Turn on/off showing the presence.
343e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * @hide this is here for consistency with setStared/showStar and should be public
344e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
345e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public void showPresence(boolean showPresence) {
346e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mPresenceView.setVisibility(showPresence ? View.VISIBLE : View.GONE);
347e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
348e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
349e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
350e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * Manually set the contact uri without loading any data
351e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
352e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public void setContactUri(Uri uri) {
353e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        setContactUri(uri, true);
354e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
355e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
356e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
357e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * Manually set the contact uri without loading any data
358e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
359e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public void setContactUri(Uri uri, boolean sendToQuickContact) {
360e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mContactUri = uri;
361e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        if (sendToQuickContact) {
362e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            mPhotoView.assignContactUri(uri);
363e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        }
364e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
365e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
366e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
367e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * Manually set the photo to display in the header. This doesn't change the
368e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * underlying {@link Contacts}, only the UI state.
369e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
370e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public void setPhoto(Bitmap bitmap) {
371e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mPhotoView.setImageBitmap(bitmap);
372e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
373e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
374e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
375e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * Manually set the photo given its id. If the id is 0, a placeholder picture will
376e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * be loaded. For any other Id, an async query is started
377e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * @hide
378e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
379e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public void setPhotoId(final long photoId, final Uri lookupUri) {
380e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        if (photoId == 0) {
381e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            setPhoto(loadPlaceholderPhoto(null));
382e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            mPhotoView.assignContactUri(lookupUri);
383e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            invalidate();
384e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        } else {
385e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            startPhotoQuery(photoId, lookupUri,
386e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    false /* don't reset query handler */);
387e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        }
388e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
389e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
390e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
391e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * Manually set the display name and phonetic name to show in the header.
392e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * This doesn't change the underlying {@link Contacts}, only the UI state.
393e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
394e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public void setDisplayName(CharSequence displayName, CharSequence phoneticName) {
395e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mDisplayNameView.setText(displayName);
396e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        if (!TextUtils.isEmpty(phoneticName)) {
397e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            mPhoneticNameView.setText(phoneticName);
398e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            mPhoneticNameView.setVisibility(View.VISIBLE);
399e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        } else {
400e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            mPhoneticNameView.setVisibility(View.GONE);
401e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        }
402e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
403e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
404e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
405e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * Manually set the social snippet text to display in the header. This doesn't change the
406e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * underlying {@link Contacts}, only the UI state.
407e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
408e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public void setSocialSnippet(CharSequence snippet) {
409e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        if (snippet == null) {
410e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            mStatusView.setVisibility(View.GONE);
411e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            mStatusAttributionView.setVisibility(View.GONE);
412e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        } else {
413e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            mStatusView.setText(snippet);
414e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            mStatusView.setVisibility(View.VISIBLE);
415e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        }
416e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
417e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
418e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
419e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * Manually set the status attribution text to display in the header.
420e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * This doesn't change the underlying {@link Contacts}, only the UI state.
421e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * @hide
422e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
423e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public void setStatusAttribution(CharSequence attribution) {
424e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        if (attribution != null) {
425e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            mStatusAttributionView.setText(attribution);
426e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            mStatusAttributionView.setVisibility(View.VISIBLE);
427e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        } else {
428e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            mStatusAttributionView.setVisibility(View.GONE);
429e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        }
430e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
431e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
432e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
433e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * Set a list of specific MIME-types to exclude and not display. For
434e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * example, this can be used to hide the {@link Contacts#CONTENT_ITEM_TYPE}
435e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * profile icon.
436e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
437e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public void setExcludeMimes(String[] excludeMimes) {
438e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mExcludeMimes = excludeMimes;
439e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mPhotoView.setExcludeMimes(excludeMimes);
440e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
441e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
442e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
443e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * Manually set all the status values to display in the header.
444e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * This doesn't change the underlying {@link Contacts}, only the UI state.
445e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * @hide
446e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * @param status             The status of the contact. If this is either null or empty,
447e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     *                           the status is cleared and the other parameters are ignored.
448e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * @param statusTimestamp    The timestamp (retrieved via a call to
449e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     *                           {@link System#currentTimeMillis()}) of the last status update.
450e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     *                           This value can be null if it is not known.
451e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * @param statusLabel        The id of a resource string that specifies the current
452e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     *                           status. This value can be null if no Label should be used.
453e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * @param statusResPackage   The name of the resource package containing the resource string
454e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     *                           referenced in the parameter statusLabel.
455e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
456e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public void setStatus(final String status, final Long statusTimestamp,
457e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            final Integer statusLabel, final String statusResPackage) {
458e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        if (TextUtils.isEmpty(status)) {
459e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            setSocialSnippet(null);
460e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            return;
461e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        }
462e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
463e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        setSocialSnippet(status);
464e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
465e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        final CharSequence timestampDisplayValue;
466e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
467e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        if (statusTimestamp != null) {
468e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            // Set the date/time field by mixing relative and absolute
469e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            // times.
470e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            int flags = DateUtils.FORMAT_ABBREV_RELATIVE;
471e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
472e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            timestampDisplayValue = DateUtils.getRelativeTimeSpanString(
473e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    statusTimestamp.longValue(), System.currentTimeMillis(),
474e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    DateUtils.MINUTE_IN_MILLIS, flags);
475e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        } else {
476e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            timestampDisplayValue = null;
477e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        }
478e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
479e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
480e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        String labelDisplayValue = null;
481e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
482e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        if (statusLabel != null) {
483e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            Resources resources;
484e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            if (TextUtils.isEmpty(statusResPackage)) {
485e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                resources = getResources();
486e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            } else {
487e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                PackageManager pm = getContext().getPackageManager();
488e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                try {
489e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    resources = pm.getResourcesForApplication(statusResPackage);
490e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                } catch (NameNotFoundException e) {
491e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    Log.w(TAG, "Contact status update resource package not found: "
492e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            + statusResPackage);
493e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    resources = null;
494e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                }
495e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            }
496e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
497e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            if (resources != null) {
498e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                try {
499e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    labelDisplayValue = resources.getString(statusLabel.intValue());
500e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                } catch (NotFoundException e) {
501e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    Log.w(TAG, "Contact status update resource not found: " + statusResPackage + "@"
502e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                            + statusLabel.intValue());
503e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                }
504e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            }
505e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        }
506e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
507e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        final CharSequence attribution;
508e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        if (timestampDisplayValue != null && labelDisplayValue != null) {
509e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            attribution = getContext().getString(
510e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    R.string.contact_status_update_attribution_with_date,
511e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    timestampDisplayValue, labelDisplayValue);
512e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        } else if (timestampDisplayValue == null && labelDisplayValue != null) {
513e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            attribution = getContext().getString(
514e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    R.string.contact_status_update_attribution,
515e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                    labelDisplayValue);
516e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        } else if (timestampDisplayValue != null) {
517e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            attribution = timestampDisplayValue;
518e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        } else {
519e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            attribution = null;
520e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        }
521e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        setStatusAttribution(attribution);
522e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
523e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
524e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
525e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * Convenience method for binding all available data from an existing
526e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * contact.
527e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     *
528e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * @param contactLookupUri a {Contacts.CONTENT_LOOKUP_URI} style URI.
529e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
530e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public void bindFromContactLookupUri(Uri contactLookupUri) {
531e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        bindFromContactUriInternal(contactLookupUri, true /* reset query handler */);
532e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
533e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
534e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
535e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * Convenience method for binding all available data from an existing
536e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * contact.
537e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     *
538e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * @param contactUri a {Contacts.CONTENT_URI} style URI.
539e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * @param resetQueryHandler whether to use a new AsyncQueryHandler or not.
540e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
541e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private void bindFromContactUriInternal(Uri contactUri, boolean resetQueryHandler) {
542e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mContactUri = contactUri;
543e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        startContactQuery(contactUri, resetQueryHandler);
544e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
545e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
546e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
547e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * Convenience method for binding all available data from an existing
548e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * contact.
549e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     *
550e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * @param emailAddress The email address used to do a reverse lookup in
551e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * the contacts database. If more than one contact contains this email
552e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * address, one of them will be chosen to bind to.
553e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
554e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public void bindFromEmail(String emailAddress) {
555e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        resetAsyncQueryHandler();
556e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
557e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mQueryHandler.startQuery(TOKEN_EMAIL_LOOKUP, emailAddress,
558e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(emailAddress)),
559e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                EMAIL_LOOKUP_PROJECTION, null, null, null);
560e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
561e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
562e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
563e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * Convenience method for binding all available data from an existing
564e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * contact.
565e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     *
566e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * @param number The phone number used to do a reverse lookup in
567e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * the contacts database. If more than one contact contains this phone
568e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * number, one of them will be chosen to bind to.
569e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
570e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public void bindFromPhoneNumber(String number) {
571e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        resetAsyncQueryHandler();
572e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
573e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mQueryHandler.startQuery(TOKEN_PHONE_LOOKUP, number,
574e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)),
575e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                PHONE_LOOKUP_PROJECTION, null, null, null);
576e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
577e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
578e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
579e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * startContactQuery
580e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     *
581e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * internal method to query contact by Uri.
582e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     *
583e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * @param contactUri the contact uri
584e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * @param resetQueryHandler whether to use a new AsyncQueryHandler or not
585e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
586e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private void startContactQuery(Uri contactUri, boolean resetQueryHandler) {
587e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        if (resetQueryHandler) {
588e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            resetAsyncQueryHandler();
589e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        }
590e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
591e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mQueryHandler.startQuery(TOKEN_CONTACT_INFO, contactUri, contactUri, ContactQuery.COLUMNS,
592e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                null, null, null);
593e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
594e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
595e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
596e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * startPhotoQuery
597e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     *
598e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * internal method to query contact photo by photo id and uri.
599e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     *
600e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * @param photoId the photo id.
601e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * @param lookupKey the lookup uri.
602e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * @param resetQueryHandler whether to use a new AsyncQueryHandler or not.
603e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
604e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    protected void startPhotoQuery(long photoId, Uri lookupKey, boolean resetQueryHandler) {
605e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        if (resetQueryHandler) {
606e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            resetAsyncQueryHandler();
607e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        }
608e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
609e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mQueryHandler.startQuery(TOKEN_PHOTO_QUERY, lookupKey,
610e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                ContentUris.withAppendedId(Data.CONTENT_URI, photoId), PhotoQuery.COLUMNS,
611e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                null, null, null);
612e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
613e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
614e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
615e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * Method to force this widget to forget everything it knows about the contact.
616e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * We need to stop any existing async queries for phone, email, contact, and photos.
617e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
618e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public void wipeClean() {
619e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        resetAsyncQueryHandler();
620e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
621e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        setDisplayName(null, null);
622e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        setPhoto(loadPlaceholderPhoto(null));
623e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        setSocialSnippet(null);
624e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        setPresence(0);
625e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mContactUri = null;
626e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mExcludeMimes = null;
627e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
628e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
629e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
630e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private void resetAsyncQueryHandler() {
631e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        // the api AsyncQueryHandler.cancelOperation() doesn't really work. Since we really
632e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        // need the old async queries to be cancelled, let's do it the hard way.
633e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        mQueryHandler = new QueryHandler(mContentResolver);
634e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
635e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
636e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    /**
637e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     * Bind the contact details provided by the given {@link Cursor}.
638e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton     */
639e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    protected void bindContactInfo(Cursor c) {
640e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        final String displayName = c.getString(ContactQuery.DISPLAY_NAME);
641e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        final String phoneticName = c.getString(ContactQuery.PHONETIC_NAME);
642e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        this.setDisplayName(displayName, phoneticName);
643e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
644e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        //Set the presence status
645e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        if (!c.isNull(ContactQuery.CONTACT_PRESENCE_STATUS)) {
646e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            int presence = c.getInt(ContactQuery.CONTACT_PRESENCE_STATUS);
647e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            setPresence(presence);
648e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            showPresence(true);
649e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        } else {
650e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            showPresence(false);
651e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        }
652e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
653e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        //Set the status update
654e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        final String status = c.getString(ContactQuery.CONTACT_STATUS);
655e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        final Long statusTimestamp = c.isNull(ContactQuery.CONTACT_STATUS_TIMESTAMP)
656e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                ? null
657e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                : c.getLong(ContactQuery.CONTACT_STATUS_TIMESTAMP);
658e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        final Integer statusLabel = c.isNull(ContactQuery.CONTACT_STATUS_LABEL)
659e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                ? null
660e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                : c.getInt(ContactQuery.CONTACT_STATUS_LABEL);
661e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        final String statusResPackage = c.getString(ContactQuery.CONTACT_STATUS_RES_PACKAGE);
662e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
663e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        setStatus(status, statusTimestamp, statusLabel, statusResPackage);
664e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
665e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
666e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    public void onClick(View view) {
667e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        switch (view.getId()) {
668e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            case R.id.photo: {
669e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                performPhotoClick();
670e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                break;
671e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            }
672e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            case R.id.name: {
673e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                performDisplayNameClick();
674e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                break;
675e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            }
676e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        }
677e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
678e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton
679e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    private Bitmap loadPlaceholderPhoto(BitmapFactory.Options options) {
680e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        if (mNoPhotoResource == 0) {
681e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton            return null;
682e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        }
683e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton        return BitmapFactory.decodeResource(mContext.getResources(),
684e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton                mNoPhotoResource, options);
685e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton    }
686e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton}
687