blob: 08bf92170927e47ce1db0aa1a80b291d082b5f04 [file] [log] [blame]
/*
* Copyright (C) 2007-2008 Esmertec AG.
* Copyright (C) 2007-2008 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.im.app;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.res.Resources;
import android.database.Cursor;
import android.net.Uri;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.style.RelativeSizeSpan;
import android.text.style.UnderlineSpan;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.graphics.drawable.Drawable;
import com.android.im.R;
import com.android.im.plugin.BrandingResourceIDs;
import com.android.im.provider.Imps;
import java.text.DateFormat;
import java.util.Calendar;
public class ContactView extends LinearLayout {
static final String[] CONTACT_PROJECTION = {
Imps.Contacts._ID,
Imps.Contacts.PROVIDER,
Imps.Contacts.ACCOUNT,
Imps.Contacts.USERNAME,
Imps.Contacts.NICKNAME,
Imps.Contacts.TYPE,
Imps.Contacts.SUBSCRIPTION_TYPE,
Imps.Contacts.SUBSCRIPTION_STATUS,
Imps.Presence.PRESENCE_STATUS,
Imps.Presence.PRESENCE_CUSTOM_STATUS,
Imps.Chats.LAST_MESSAGE_DATE,
Imps.Chats.LAST_UNREAD_MESSAGE,
};
static final int COLUMN_CONTACT_ID = 0;
static final int COLUMN_CONTACT_PROVIDER = 1;
static final int COLUMN_CONTACT_ACCOUNT = 2;
static final int COLUMN_CONTACT_USERNAME = 3;
static final int COLUMN_CONTACT_NICKNAME = 4;
static final int COLUMN_CONTACT_TYPE = 5;
static final int COLUMN_SUBSCRIPTION_TYPE = 6;
static final int COLUMN_SUBSCRIPTION_STATUS = 7;
static final int COLUMN_CONTACT_PRESENCE_STATUS = 8;
static final int COLUMN_CONTACT_CUSTOM_STATUS = 9;
static final int COLUMN_LAST_MESSAGE_DATE = 10;
static final int COLUMN_LAST_MESSAGE = 11;
//private ImageView mPresence;
private TextView mLine1;
private TextView mLine2;
private TextView mTimeStamp;
public ContactView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
//mPresence = (ImageView) findViewById(R.id.presence);
mLine1 = (TextView) findViewById(R.id.line1);
mLine2 = (TextView) findViewById(R.id.line2);
mLine2.setCompoundDrawablePadding(5);
mTimeStamp = (TextView)findViewById(R.id.timestamp);
}
public void bind(Cursor cursor, String underLineText, boolean scrolling) {
bind(cursor, underLineText, true, scrolling);
}
public void bind(Cursor cursor, String underLineText, boolean showChatMsg, boolean scrolling) {
Resources r = getResources();
long providerId = cursor.getLong(COLUMN_CONTACT_PROVIDER);
String username = cursor.getString(COLUMN_CONTACT_USERNAME);
String nickname = cursor.getString(COLUMN_CONTACT_NICKNAME);
int type = cursor.getInt(COLUMN_CONTACT_TYPE);
String statusText = cursor.getString(COLUMN_CONTACT_CUSTOM_STATUS);
String lastMsg = cursor.getString(COLUMN_LAST_MESSAGE);
boolean hasChat = !cursor.isNull(COLUMN_LAST_MESSAGE_DATE);
ImApp app = ImApp.getApplication((Activity)mContext);
BrandingResources brandingRes = app.getBrandingResource(providerId);
int presence = cursor.getInt(COLUMN_CONTACT_PRESENCE_STATUS);
int iconId = 0;
// status icon
if (Imps.Contacts.TYPE_GROUP == type) {
iconId = lastMsg == null ? R.drawable.group_chat : R.drawable.group_chat_new;
} else if (hasChat) {
iconId = lastMsg == null ? BrandingResourceIDs.DRAWABLE_READ_CHAT
: BrandingResourceIDs.DRAWABLE_UNREAD_CHAT;
} else {
iconId = PresenceUtils.getStatusIconId(presence);
}
//mPresence.setImageDrawable(brandingRes.getDrawable(iconId));
Drawable presenceIcon = brandingRes.getDrawable(iconId);
// line1
CharSequence line1;
if (Imps.Contacts.TYPE_GROUP == type) {
ContentResolver resolver = getContext().getContentResolver();
long id = cursor.getLong(ContactView.COLUMN_CONTACT_ID);
line1 = queryGroupMembers(resolver, id);
} else {
line1 = TextUtils.isEmpty(nickname) ?
ImpsAddressUtils.getDisplayableAddress(username) : nickname;
if (!TextUtils.isEmpty(underLineText)) {
// highlight/underline the word being searched
String lowercase = line1.toString().toLowerCase();
int start = lowercase.indexOf(underLineText.toLowerCase());
if (start >= 0) {
int end = start + underLineText.length();
SpannableString str = new SpannableString(line1);
str.setSpan(new UnderlineSpan(), start, end,
Spannable.SPAN_INCLUSIVE_INCLUSIVE);
line1 = str;
}
}
if (Imps.Contacts.TYPE_TEMPORARY == type) {
// Add a mark at the front of name if it's only a temporary
// contact.
SpannableStringBuilder str = new SpannableStringBuilder(
r.getText(R.string.unknown_contact));
str.setSpan(new RelativeSizeSpan(0.8f), 0, str.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
str.append(line1);
line1 = str;
}
}
mLine1.setText(line1);
// time stamp
if (showChatMsg && hasChat) {
mTimeStamp.setVisibility(VISIBLE);
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(cursor.getLong(COLUMN_LAST_MESSAGE_DATE));
DateFormat formatter = DateFormat.getTimeInstance(DateFormat.SHORT);
mTimeStamp.setText(formatter.format(cal.getTime()));
} else {
mTimeStamp.setVisibility(GONE);
}
// line2
CharSequence line2 = null;
if (showChatMsg) {
line2 = lastMsg;
}
if (TextUtils.isEmpty(line2)){
if (Imps.Contacts.TYPE_GROUP == type) {
// Show nothing in line2 if it's a group and don't
// have any unread message.
line2 = null;
} else {
// Show the custom status text if there's no new message.
line2 = statusText;
}
}
if (TextUtils.isEmpty(line2)) {
// Show a string of presence if there is neither new message nor
// custom status text.
line2 = brandingRes.getString(PresenceUtils.getStatusStringRes(presence));
}
mLine2.setText(line2);
mLine2.setCompoundDrawablesWithIntrinsicBounds(null, null, presenceIcon, null);
View contactInfoPanel = findViewById(R.id.contactInfo);
if (hasChat && showChatMsg) {
contactInfoPanel.setBackgroundResource(R.drawable.bubble);
mLine1.setTextColor(r.getColor(R.color.chat_contact));
} else {
contactInfoPanel.setBackgroundDrawable(null);
contactInfoPanel.setPadding(4, 0, 0, 0);
mLine1.setTextColor(r.getColor(R.color.nonchat_contact));
}
}
private String queryGroupMembers(ContentResolver resolver, long groupId) {
String[] projection = { Imps.GroupMembers.NICKNAME };
Uri uri = ContentUris.withAppendedId(Imps.GroupMembers.CONTENT_URI, groupId);
Cursor c = resolver.query(uri, projection, null, null, null);
StringBuilder buf = new StringBuilder();
if(c != null) {
while(c.moveToNext()) {
buf.append(c.getString(0));
if(!c.isLast()) {
buf.append(',');
}
}
c.close();
}
return buf.toString();
}
}