blob: 172d720626e120e1d6823cdce452ca2946df1ba6 [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.contacts.common.list;
import android.content.Context;
import android.graphics.Rect;
import android.net.Uri;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.QuickContactBadge;
import android.widget.TextView;
import com.android.contacts.common.ContactPhotoManager;
import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
import com.android.contacts.common.MoreContactUtils;
import com.android.contacts.common.R;
/**
* A ContactTile displays a contact's picture and name
*/
public abstract class ContactTileView extends FrameLayout {
private final static String TAG = ContactTileView.class.getSimpleName();
private Uri mLookupUri;
private ImageView mPhoto;
private QuickContactBadge mQuickContact;
private TextView mName;
private TextView mStatus;
private TextView mPhoneLabel;
private TextView mPhoneNumber;
private ContactPhotoManager mPhotoManager = null;
private View mPushState;
private View mHorizontalDivider;
protected Listener mListener;
public ContactTileView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mName = (TextView) findViewById(R.id.contact_tile_name);
mQuickContact = (QuickContactBadge) findViewById(R.id.contact_tile_quick);
mPhoto = (ImageView) findViewById(R.id.contact_tile_image);
mStatus = (TextView) findViewById(R.id.contact_tile_status);
mPhoneLabel = (TextView) findViewById(R.id.contact_tile_phone_type);
mPhoneNumber = (TextView) findViewById(R.id.contact_tile_phone_number);
mPushState = findViewById(R.id.contact_tile_push_state);
mHorizontalDivider = findViewById(R.id.contact_tile_horizontal_divider);
OnClickListener listener = createClickListener();
setOnClickListener(listener);
}
protected OnClickListener createClickListener() {
return new OnClickListener() {
@Override
public void onClick(View v) {
if (mListener == null) return;
mListener.onContactSelected(
getLookupUri(),
MoreContactUtils.getTargetRectFromView(ContactTileView.this));
}
};
}
public void setPhotoManager(ContactPhotoManager photoManager) {
mPhotoManager = photoManager;
}
/**
* Populates the data members to be displayed from the
* fields in {@link com.android.contacts.common.list.ContactEntry}
*/
public void loadFromContact(ContactEntry entry) {
if (entry != null) {
mName.setText(getNameForView(entry));
mLookupUri = entry.lookupUri;
if (mStatus != null) {
if (entry.status == null) {
mStatus.setVisibility(View.GONE);
} else {
mStatus.setText(entry.status);
mStatus.setCompoundDrawablesWithIntrinsicBounds(entry.presenceIcon,
null, null, null);
mStatus.setVisibility(View.VISIBLE);
}
}
if (mPhoneLabel != null) {
if (TextUtils.isEmpty(entry.phoneLabel)) {
mPhoneLabel.setVisibility(View.GONE);
} else {
mPhoneLabel.setVisibility(View.VISIBLE);
mPhoneLabel.setText(entry.phoneLabel);
}
}
if (mPhoneNumber != null) {
// TODO: Format number correctly
mPhoneNumber.setText(entry.phoneNumber);
}
setVisibility(View.VISIBLE);
if (mPhotoManager != null) {
DefaultImageRequest request = getDefaultImageRequest(entry.namePrimary,
entry.lookupKey);
configureViewForImage(entry.photoUri == null);
if (mPhoto != null) {
mPhotoManager.loadPhoto(mPhoto, entry.photoUri, getApproximateImageSize(),
isDarkTheme(), isContactPhotoCircular(), request);
if (mQuickContact != null) {
mQuickContact.assignContactUri(mLookupUri);
}
} else if (mQuickContact != null) {
mQuickContact.assignContactUri(mLookupUri);
mPhotoManager.loadPhoto(mQuickContact, entry.photoUri,
getApproximateImageSize(), isDarkTheme(), isContactPhotoCircular(),
request);
}
} else {
Log.w(TAG, "contactPhotoManager not set");
}
if (mPushState != null) {
mPushState.setContentDescription(entry.namePrimary);
} else if (mQuickContact != null) {
mQuickContact.setContentDescription(entry.namePrimary);
}
} else {
setVisibility(View.INVISIBLE);
}
}
public void setListener(Listener listener) {
mListener = listener;
}
public void setHorizontalDividerVisibility(int visibility) {
if (mHorizontalDivider != null) mHorizontalDivider.setVisibility(visibility);
}
public Uri getLookupUri() {
return mLookupUri;
}
protected QuickContactBadge getQuickContact() {
return mQuickContact;
}
protected View getPhotoView() {
return mPhoto;
}
/**
* Returns the string that should actually be displayed as the contact's name. Subclasses
* can override this to return formatted versions of the name - i.e. first name only.
*/
protected String getNameForView(ContactEntry contactEntry) {
return contactEntry.namePrimary;
}
/**
* Implemented by subclasses to estimate the size of the picture. This can return -1 if only
* a thumbnail is shown anyway
*/
protected abstract int getApproximateImageSize();
protected abstract boolean isDarkTheme();
/**
* Implemented by subclasses to reconfigure the view's layout and subviews, based on whether
* or not the contact has a user-defined photo.
*
* @param isDefaultImage True if the contact does not have a user-defined contact photo
* (which means a default contact image will be applied by the {@link ContactPhotoManager}
*/
protected void configureViewForImage(boolean isDefaultImage) {
// No-op by default.
}
/**
* Implemented by subclasses to allow them to return a {@link DefaultImageRequest} with the
* various image parameters defined to match their own layouts.
*
* @param displayName The display name of the contact
* @param lookupKey The lookup key of the contact
* @return A {@link DefaultImageRequest} object with each field configured by the subclass
* as desired, or {@code null}.
*/
protected DefaultImageRequest getDefaultImageRequest(String displayName, String lookupKey) {
return new DefaultImageRequest(displayName, lookupKey, isContactPhotoCircular());
}
/**
* Whether contact photo should be displayed as a circular image. Implemented by subclasses
* so they can change which drawables to fetch.
*/
protected boolean isContactPhotoCircular() {
return true;
}
public interface Listener {
/**
* Notification that the contact was selected; no specific action is dictated.
*/
void onContactSelected(Uri contactLookupUri, Rect viewRect);
/**
* Notification that the specified number is to be called.
*/
void onCallNumberDirectly(String phoneNumber);
/**
* @return The width of each tile. This doesn't have to be a precise number (e.g. paddings
* can be ignored), but is used to load the correct picture size from the database
*/
int getApproximateTileWidth();
}
}