package uk.ac.cam.echo;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.provider.CalendarContract;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.Button;
import android.widget.ExpandableListAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import org.w3c.dom.Text;
import java.sql.Date;
import java.util.Calendar;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import uk.ac.cam.echo.activities.UserListActivity;
import uk.ac.cam.echo.client.ClientApi;
import uk.ac.cam.echo.data.Conversation;
import uk.ac.cam.echo.data.Interest;
import uk.ac.cam.echo.data.User;
public class UserAdapter extends BaseExpandableListAdapter {
private int layoutResourceId;
private Activity activity;
private HashMap<Long, UserCache> userMap;
private Context context;
private ClientApi api;
private List<User> data;
private static String conversationName, loggedInUserName;
public UserAdapter(Context context, int layoutResourceId,
List<User> data) {
this.context = context;
userMap = new HashMap<Long, UserCache>();
this.layoutResourceId = layoutResourceId;
this.data = data;
}
public static UserAdapter newInstance(Activity activity, int layoutResourceId,
List<User> data, ClientApi api) {
UserAdapter adapter = new UserAdapter(activity.getBaseContext(), layoutResourceId, data);
adapter.setActivity(activity);
adapter.setApi(api);
return adapter;
}
@Override
public View getChildView(int groupPosition, final int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
View row = convertView;
UserHolder holder;
if(row == null) {
LayoutInflater inflater = (LayoutInflater)context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.user_child_item, parent, false);
holder = new UserHolder();
holder.avatar = (ImageView)row.findViewById(R.id.avatar);
holder.user = (TextView)row.findViewById(R.id.username);
holder.jobAndCompany = (TextView)row.findViewById(R.id.jobAndCompany);
holder.interests = (TextView)row.findViewById(R.id.interests);
holder.phone = (TextView)row.findViewById(R.id.phone);
holder.email = (TextView)row.findViewById(R.id.email);
holder.phoneButton = (ImageButton)row.findViewById(R.id.phoneUser);
holder.emailButton = (ImageButton)row.findViewById(R.id.emailUser);
row.setTag(holder);
} else {
holder = (UserHolder)row.getTag();
}
final User user = data.get(groupPosition);
if(userMap.get(user.getId()).hasAttributes()) {
final UserCache userCache = userMap.get(user.getId());
holder.avatar.setImageBitmap(userCache.avatar);
holder.user.setText(userCache.user);
holder.jobAndCompany.setText(userCache.jobAndCompany);
holder.interests.setText(userCache.interests);
holder.phone.setText(userCache.phone);
holder.email.setText(userCache.email);
holder.phoneButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String uri = "tel:" + userCache.phone.trim();
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse(uri));
context.startActivity(intent);
}
});
holder.emailButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
"mailto", userCache.email, null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, user.getCurrentConversation().getName());
emailIntent.setType("plain/text");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Dear " + user.getDisplayName() +",\n\n" );
emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(Intent.createChooser(emailIntent, "Send Email using: "));
}
});
} else {
new AsyncAdapter().execute(user, holder.avatar, holder.user, holder.jobAndCompany,
holder.interests, holder.phone, holder.email, holder.phoneButton, holder.emailButton);
}
return row;
}
@Override
public boolean isChildSelectable(int i, int i2) {
return false;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
View row = convertView;
User user = data.get(groupPosition);
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater)context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.user_group_item, parent, false);
}
TextView userDisplay = (TextView) row.findViewById(R.id.userFullName);
userDisplay.setText(user.getDisplayName());
TextView lastSeen = (TextView)row.findViewById(R.id.lastSeenText);
if(userMap.containsKey(user.getId())) {
lastSeen.setText(userMap.get(user.getId()).lastActive);
lastSeen.setTextColor(context.getResources().getColor(userMap.get(user.getId()).colour));
} else {
new AsyncTask<Object, Void, String>() {
User user;
TextView lastSeen;
int colour;
@Override
protected String doInBackground(Object... args) {
user = (User)args[0];
lastSeen = (TextView)args[1];
long timestamp = api.conferenceResource.lastTimeActive(1, user.getId());
colour = R.color.darkRed;
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date(timestamp));
if(calendar.get(Calendar.MONTH) > 1)
return calendar.get(Calendar.MONTH) + " months";
else if(calendar.get(Calendar.DAY_OF_YEAR)-1 > 1) {
colour = R.color.midOrange;
return calendar.get(Calendar.DAY_OF_YEAR)-1 + " days";
}
else if(calendar.get(Calendar.HOUR_OF_DAY) > 1){
colour = R.color.darkGreen;
return calendar.get(Calendar.HOUR_OF_DAY)-1 + " hours";
}
else {
colour = R.color.green;
return calendar.get(Calendar.MINUTE) + " mins";
}
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
lastSeen.setText(s);
userMap.put(user.getId(), new UserCache(s,colour));
lastSeen.setTextColor(context.getResources().getColor(colour));
}
}.execute(user, lastSeen);
}
return row;
}
public void setApi(ClientApi clientApi) { api = clientApi; }
public void setActivity(Activity activity) {this.activity = activity;}
public void updateList(List<User> newData) {
data = newData;
notifyDataSetChanged();
}
@Override
public int getGroupCount() {
return data == null ? 0 : data.size();
}
@Override
public int getChildrenCount(int i) {
return 1;
}
@Override
public Object getGroup(int groupPosition) {
return data.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int i2) {
return data.get(groupPosition);
}
@Override
public long getGroupId(int groupPosition) {
return data.get(groupPosition).getId();
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return data.get(groupPosition).getId();
}
@Override
public boolean hasStableIds() {
return true;
}
static class UserHolder {
ImageView avatar;
TextView user;
TextView jobAndCompany;
TextView interests;
TextView phone;
TextView email;
ImageButton phoneButton;
ImageButton emailButton;
}
private class AsyncAdapter extends AsyncTask<Object, Void, String> {
User user;
String userDisplay;
ImageView imgView;
TextView username;
TextView jobAndCompany;
TextView interests;
TextView phone;
TextView email;
Bitmap avatar;
ImageButton phoneButton;
ImageButton emailButton;
String usernameText;
String jobAndCompanyText;
String interestsText;
String phoneText;
String emailText;
@Override
protected String doInBackground(Object... params) {
user = (User)params[0];
imgView = (ImageView)params[1];
username = (TextView)params[2];
jobAndCompany = (TextView)params[3];
interests = (TextView)params[4];
phone = (TextView)params[5];
email = (TextView)params[6];
phoneButton = (ImageButton)params[7];
emailButton = (ImageButton)params[8];
if(conversationName == null || conversationName.equals(""))
conversationName = user.getCurrentConversation().getName();
if(loggedInUserName == null || loggedInUserName.equals(""))
loggedInUserName = ((UserListActivity)activity).getService().getUser().getDisplayName();
userDisplay = user.getDisplayName();
usernameText = user.getUsername();
Collection<Interest> interests = user.getInterests();
interestsText = ConversationStringUtil.getInterestText(interests);
jobAndCompanyText = ConversationStringUtil.getJobCompanyText(user.getJobTitle(), user.getCompany());
phoneText = user.getPhoneNumber();
emailText = user.getEmail();
avatar = BitmapUtil.getBitmapFromURL(user.getAvatarLink() + "&s=90");
return null;
}
@Override
protected void onPostExecute(String str) {
super.onPostExecute(str);
username.setText(usernameText);
jobAndCompany.setText(jobAndCompanyText);
interests.setText(interestsText);
phone.setText(phoneText);
email.setText(emailText);
imgView.setImageBitmap(avatar);
if(phoneText!=null && !phoneText.equals("")){
phoneButton.setVisibility(View.VISIBLE);
phoneButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
((UserListActivity)activity).phoneUser(phoneText);
}
});
} else {
phoneButton.setVisibility(View.INVISIBLE);
}
if(emailText!=null && !emailText.equals("")){
emailButton.setVisibility(View.VISIBLE);
emailButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
((UserListActivity)activity).emailUser(emailText, conversationName, loggedInUserName, userDisplay);
}
});
}else {
emailButton.setVisibility(View.INVISIBLE);
}
userMap.put(user.getId(), userMap.get(user.getId()).setAttributes(avatar, usernameText, jobAndCompanyText,
interestsText, phoneText, emailText));
}
}
}