package eoc.studio.voicecard.facebook.friends;
import java.util.Iterator;
import java.util.List;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import eoc.studio.voicecard.R;
import eoc.studio.voicecard.facebook.enetities.FriendInfo;
import eoc.studio.voicecard.utils.ListUtility;
import eoc.studio.voicecard.utils.NetworkUtility;
public class FriendsAdapterView extends BaseAdapter
{
private static final String TAG = "FriendsAdapter";
private FriendsAdapterData friendsAdapterData;
private LayoutInflater layoutInflater;
private Context context;
private List<FriendInfo> friends;
private ListView showFriendView;
private ViewTag viewTag;
private boolean isPause = false;
private boolean isInterrupt = false;
FriendsAdapterView(Context context, List<FriendInfo> friends,
FriendsAdapterData friendsAdapterData, ListView showFriendView)
{
this.context = context;
this.friends = friends;
this.friendsAdapterData = friendsAdapterData;
this.showFriendView = showFriendView;
layoutInflater = LayoutInflater.from(context);
isPause = false;
isInterrupt = false;
DownlaodImageThread downlaodImageThread = new DownlaodImageThread(friends, 0,
friends.size());
downlaodImageThread.start();
}
@Override
public int getCount()
{
return friends.size();
}
@Override
public Object getItem(int position)
{
return friends.get(position);
}
@Override
public long getItemId(int position)
{
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
if (convertView == null)
{
convertView = layoutInflater.inflate(R.layout.select_friend_list_item, null);
viewTag = new ViewTag(
(ImageView) convertView.findViewById(R.id.glb_selectfriend_list_item_header),
(TextView) convertView.findViewById(R.id.glb_selectfriend_list_item_name),
(ImageView) convertView
.findViewById(R.id.glb_selectfriend_list_item_check_icon));
convertView.setTag(viewTag);
}
else
{
viewTag = (ViewTag) convertView.getTag();
}
convertView.setId(ListUtility.BASE_INDEX + position);
if (position < friends.size())
{
viewTag.name.setText(friends.get(position).getFriendName());
if (friends.get(position).getSelectedState() == FriendsAdapterData.SELECT)
{
viewTag.checkIcon.setImageDrawable(context.getResources().getDrawable(
R.drawable.icon_checkbox_check));
}
else
{
viewTag.checkIcon.setImageDrawable(context.getResources().getDrawable(
R.drawable.icon_checkbox));
}
// set header
byte[] img = friends.get(position).getFriendImg();
if (img != null)
{
viewTag.header.setImageBitmap(BitmapFactory.decodeByteArray(img, 0, img.length));
}
else
{
viewTag.header.setImageDrawable(context.getResources()
.getDrawable(R.drawable.dummy));
}
}
return convertView;
}
public void updateSelectedState(int position, int selectedState)
{
friends.get(position).setSelecedState(selectedState);
notifyDataSetChanged();
}
public void changeSelectedState(int position, int selectedState)
{
for (FriendInfo friendInfo : friends)
{
friendInfo.setSelecedState(FriendsAdapterData.UNSELECT);
}
friends.get(position).setSelecedState(selectedState);
notifyDataSetChanged();
}
public void setPause(boolean isPause)
{
this.isPause = isPause;
}
public void setInterrupt(boolean isInterrupt)
{
this.isInterrupt = isInterrupt;
}
public void loadImagefromPosition(int startPostion, int endPosition)
{
if (startPostion > 0 && endPosition <= friends.size())
{
DownlaodImageThread downlaodImageThread = new DownlaodImageThread(friends.subList(
startPostion, endPosition), startPostion, endPosition);
downlaodImageThread.start();
}
}
private Handler showImgHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
Log.d(TAG, "showImgHandler === msg.what === " + msg.what);
if (msg.what < friends.size())
{
if (friends.get(msg.what).getFriendImg() == null)
{
Log.d(TAG, "friends is null");
if (showFriendView.findViewById(ListUtility.BASE_INDEX + msg.what) != null)
{
viewTag = (ViewTag) showFriendView.findViewById(
ListUtility.BASE_INDEX + msg.what).getTag();
}
else
{
Log.d(TAG, "friends.get(msg.what) is null");
}
}
else
{
Log.d(TAG, "friends not null");
if (showFriendView.findViewById(ListUtility.BASE_INDEX + msg.what) != null)
{
viewTag = (ViewTag) showFriendView.findViewById(
ListUtility.BASE_INDEX + msg.what).getTag();
byte[] img = friends.get(msg.what).getFriendImg();
viewTag.header.setImageBitmap(BitmapFactory.decodeByteArray(img, 0,
img.length));
}
else
{
Log.d(TAG, "friends.get(msg.what) not null but findView is null");
}
}
}
}
};
public void clearList()
{
for (Iterator it = friends.iterator(); it.hasNext();)
{
it.remove();
}
friends.clear();
}
class ViewTag
{
ImageView header;
TextView name;
ImageView checkIcon;
public ViewTag(ImageView header, TextView name, ImageView checkIcon)
{
this.header = header;
this.name = name;
this.checkIcon = checkIcon;
}
}
private class DownlaodImageThread extends Thread
{
List<FriendInfo> friendList;
int startPosition;
int endPosition;
public DownlaodImageThread(List<FriendInfo> friendList, int startPosition, int endPosition)
{
this.friendList = friendList;
this.startPosition = startPosition;
this.endPosition = endPosition;
}
@Override
public void run()
{
Log.d(TAG, "friendList size === " + friendList.size());
Log.d(TAG, "startPosition === " + startPosition);
Log.d(TAG, "endPosition === " + endPosition);
for (int i = startPosition; i < endPosition; i++)
{
if (isInterrupt)
{
break;
}
if (!isPause)
{
int position = i - startPosition;
if (position < friendList.size())
{
FriendInfo friendInfo = friendList.get(position);
byte[] friendImg = friendInfo.getFriendImg();
if (friendImg == null)
{
friendImg = NetworkUtility.getWebImage(friendInfo.getFriendImgLink());
friendsAdapterData.updateFriendImg(friendInfo.getFriendId(), friendImg);
if (position < friendList.size())
friendList.get(position).setFriendImg(friendImg);
}
showImgHandler.sendMessage(showImgHandler.obtainMessage(i));
}
else
{
break;
}
}
else
{
break;
}
}
Log.d(TAG, "Download img finish() ");
}
}
}