package xmpp.client.ui.adapter;
import xmpp.client.Constants;
import xmpp.client.R;
import xmpp.client.service.chat.multi.MultiChatInfo;
import xmpp.client.service.user.User;
import xmpp.client.service.user.UserState;
import xmpp.client.service.user.contact.Contact;
import xmpp.client.service.user.group.GroupList;
import xmpp.client.ui.provider.ConferenceProvider;
import xmpp.client.ui.provider.ContactProvider;
import android.content.Context;
import android.graphics.Color;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.QuickContactBadge;
import android.widget.TextView;
public class RosterAdapter extends BaseAdapter implements Constants {
@SuppressWarnings("unused")
private static final String TAG = RosterAdapter.class.getName();
private final Context mContext;
private CharSequence activeGroup;
private final ContactProvider mContactProvider;
private final ConferenceProvider mConferenceProvider;
public RosterAdapter(Context context, ContactProvider contactProvider,
ConferenceProvider conferenceProvider) {
mContactProvider = contactProvider;
mConferenceProvider = conferenceProvider;
mContext = context;
activeGroup = GROUP_STARTUP;
}
public void addRosterEntry(User re) {
mContactProvider.add(re);
notifyDataSetChanged();
}
public void delRosterEntry(String address) {
mContactProvider.remove(address);
notifyDataSetChanged();
}
@Override
public int getCount() {
if (activeGroup.equals(GROUP_ALL_CONTACTS)) {
return mContactProvider.userSize() + 1;
} else if (activeGroup.equals(GROUP_CONFERENCES)) {
return mConferenceProvider.size() + 1;
} else if (activeGroup.equals(GROUP_ONLINE_CONTACTS)) {
return mContactProvider.userOnlineSize() + 1;
} else if (activeGroup.equals(GROUP_STARTUP)) {
return 1;
} else {
return mContactProvider.userGroupSize(activeGroup) + 1;
}
}
public GroupList getGroups() {
return mContactProvider.getGroups();
}
@Override
public Object getItem(int position) {
if (position == 0) {
return mContactProvider.getMeContact();
}
return getRosterItem(position - 1);
}
@Override
public long getItemId(int position) {
return getItem(position).hashCode();
}
private View getNormalItemView(int position, View view) {
final TextView name = (TextView) view.findViewById(R.id.name_text);
final TextView status = (TextView) view.findViewById(R.id.status_text);
name.setTextColor(Color.BLACK);
status.setTextColor(Color.BLACK);
view.setBackgroundResource(R.drawable.listitem_default);
view.findViewById(R.id.loading_spinner).setVisibility(View.GONE);
final Contact contact = (Contact) getItem(position);
final TextView unread = (TextView) view.findViewById(R.id.unread_text);
if (contact.getUnreadMessages() == 0) {
unread.setVisibility(View.GONE);
} else {
unread.setVisibility(View.VISIBLE);
unread.setText("" + contact.getUnreadMessages());
}
final LinearLayout iconContainer = (LinearLayout) view
.findViewById(R.id.icon_container);
iconContainer.removeAllViews();
for (final User user : contact.getUsers()) {
if (user.isInvisible() || !user.getUserState().isOnline()) {
continue;
}
final ImageView iview = new ImageView(mContext);
switch (user.getTransportType()) {
case User.TRANSPORT_ICQ:
iview.setImageResource(R.drawable.ic_state_icq);
break;
case User.TRANSPORT_MSN:
iview.setImageResource(R.drawable.ic_state_msn);
break;
default:
iview.setImageResource(R.drawable.ic_state_xmpp);
break;
}
iview.setColorFilter(Color.parseColor(mContext.getString(user
.getUserState().getStatusColorRessourceID())));
iconContainer.addView(iview);
}
return view;
}
public Contact getRosterEntry(String address) {
return mContactProvider.getContact(address);
}
public Object getRosterItem(int position) {
if (activeGroup.equals(GROUP_ALL_CONTACTS)
|| activeGroup.equals(GROUP_ONLINE_CONTACTS)) {
return mContactProvider.getContact(position);
} else if (activeGroup.equals(GROUP_CONFERENCES)) {
return mConferenceProvider.getList().get(position);
} else {
return mContactProvider.getContactInGroup(activeGroup, position);
}
}
private View getSelfItemView(int position, View view) {
final TextView name = (TextView) view.findViewById(R.id.name_text);
final TextView status = (TextView) view.findViewById(R.id.status_text);
name.setTextColor(Color.WHITE);
status.setTextColor(Color.WHITE);
final Contact contact = (Contact) getItem(position);
switch (contact.getUserState().getStatus()) {
case UserState.STATUS_AVAILABLE:
view.setBackgroundResource(R.drawable.rosteritem_highlight_online);
break;
case UserState.STATUS_AWAY:
case UserState.STATUS_IDLE:
view.setBackgroundResource(R.drawable.rosteritem_highlight_away);
break;
case UserState.STATUS_OFFLINE:
view.setBackgroundResource(R.drawable.rosteritem_highlight_offline);
break;
case UserState.STATUS_DO_NOT_DISTURB:
view.setBackgroundResource(R.drawable.rosteritem_highlight_donotdisturb);
break;
}
final TextView unread = (TextView) view.findViewById(R.id.unread_text);
unread.setVisibility(View.GONE);
final LinearLayout iconContainer = (LinearLayout) view
.findViewById(R.id.icon_container);
iconContainer.removeAllViews();
if (contact.getUserState().isTemporaryStatus()) {
view.findViewById(R.id.loading_spinner).setVisibility(View.VISIBLE);
} else {
view.findViewById(R.id.loading_spinner).setVisibility(View.GONE);
}
return view;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rosteritem;
if (convertView == null) {
final LayoutInflater layoutInflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
rosteritem = layoutInflater.inflate(R.layout.roster_item, parent,
false);
} else {
rosteritem = convertView;
}
if (activeGroup == GROUP_CONFERENCES && position != 0) {
handleConference(position, rosteritem);
} else {
handleContact(position, rosteritem);
}
return rosteritem;
}
private void handleConference(int position, View view) {
final MultiChatInfo mucinfo = (MultiChatInfo) getItem(position);
final TextView name = (TextView) view.findViewById(R.id.name_text);
name.setText(mucinfo.getName());
final TextView status = (TextView) view.findViewById(R.id.status_text);
status.setText(mucinfo.getJid());
name.setTextColor(Color.BLACK);
status.setTextColor(Color.BLACK);
view.setBackgroundResource(R.drawable.listitem_default);
view.findViewById(R.id.loading_spinner).setVisibility(View.GONE);
/*
* status.setCompoundDrawablesWithIntrinsicBounds(
* UserState.getStatusIconResourceID(UserState.STATUS_OFFLINE), 0, 0,
* 0);
*/
final QuickContactBadge q = (QuickContactBadge) view
.findViewById(R.id.user_badge);
q.setImageResource(R.drawable.ic_group_picture);
final TextView unread = (TextView) view.findViewById(R.id.unread_text);
unread.setVisibility(View.GONE);
final LinearLayout iconContainer = (LinearLayout) view
.findViewById(R.id.icon_container);
iconContainer.removeAllViews();
}
private void handleContact(int position, View rosteritem) {
final Contact contact = (Contact) getItem(position);
final TextView name = (TextView) rosteritem
.findViewById(R.id.name_text);
name.setText(contact.getUserName());
final TextView status = (TextView) rosteritem
.findViewById(R.id.status_text);
final CharSequence statusText = contact.getUser().getStatusText();
if (statusText != null) {
status.setText(contact.getUser().getStatusTextSpannable(mContext));
}
final QuickContactBadge q = (QuickContactBadge) rosteritem
.findViewById(R.id.user_badge);
if (contact.getUserContact() != null) {
q.assignContactUri(Uri.parse(contact.getUserContact()));
}
q.setImageBitmap(contact.getBitmap(mContext, false));
if (position == 0) {
getSelfItemView(position, rosteritem);
} else {
getNormalItemView(position, rosteritem);
}
}
public void setActiveGroup(String id) {
activeGroup = id;
notifyDataSetChanged();
}
public void updateRosterEntry(User re) {
mContactProvider.update(re);
notifyDataSetChanged();
}
}