package com.smartisanos.sidebar.view;
import java.util.ArrayList;
import java.util.List;
import com.smartisanos.sidebar.SidebarController;
import com.smartisanos.sidebar.SidebarMode;
import com.smartisanos.sidebar.util.ContactItem;
import com.smartisanos.sidebar.util.ContactManager;
import com.smartisanos.sidebar.util.LOG;
import com.smartisanos.sidebar.util.Utils;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.view.DragEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.ImageView;
import android.widget.TextView;
import com.smartisanos.sidebar.R;
import com.smartisanos.sidebar.util.anim.Anim;
import com.smartisanos.sidebar.util.anim.AnimListener;
import com.smartisanos.sidebar.util.anim.Vector3f;
public class ContactListAdapter extends SidebarAdapter {
private static float SCALE_SIZE = 1.4f;
private static final LOG log = LOG.getInstance(ContactListAdapter.class);
private Context mContext;
private ContactManager mManager;
private List<ContactItem> mContacts;
private List<ContactItem> mAcceptableContacts = new ArrayList<ContactItem>();
private DragEvent mDragEvent;
private Handler mHandler;
public boolean isEnableIconShadow = false;
public ContactListAdapter(Context context) {
mContext = context;
mHandler = new Handler(Looper.getMainLooper());
mManager = ContactManager.getInstance(mContext);
mContacts = mManager.getContactList();
mAcceptableContacts.addAll(mContacts);
mManager.addListener(new ContactManager.RecentUpdateListener() {
@Override
public void onUpdate() {
updateData();
}
});
}
private void updateAcceptableResolveInfos() {
mAcceptableContacts.clear();
for (ContactItem ci : mContacts) {
if (mDragEvent == null || ci.acceptDragEvent(mContext, mDragEvent)) {
mAcceptableContacts.add(ci);
}
}
notifyDataSetChanged();
}
@Override
public void moveItemPostion(Object object, int index) {
ContactItem item = (ContactItem) object;
if(index < 0){
index = 0;
}
if(index >= mContacts.size()){
index = mContacts.size() - 1;
}
int now = mContacts.indexOf(item);
if(now == -1 || now == index){
return ;
}
mContacts.remove(now);
mContacts.add(index, item);
onOrderChange();
}
@Override
public void onDragStart(DragEvent event) {
if (mDragEvent != null) {
mDragEvent.recycle();
mDragEvent = null;
}
mDragEvent = DragEvent.obtain(event);
updateAcceptableResolveInfos();
}
@Override
public void onDragEnd() {
if (mDragEvent == null) {
return;
}
mDragEvent.recycle();
mDragEvent = null;
updateAcceptableResolveInfos();
}
@Override
public void updateData() {
mHandler.post(new Runnable(){
@Override
public void run() {
mContacts = mManager.getContactList();
updateAcceptableResolveInfos();
}
});
}
@Override
public int getCount() {
return mAcceptableContacts.size();
}
@Override
public Object getItem(int position) {
return mAcceptableContacts.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
private Anim mIconTouchedAnim;
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
ContactItem item = mAcceptableContacts.get(position);
if (convertView == null) {
View view = LayoutInflater.from(mContext).inflate(R.layout.contact_item, null);
holder = new ViewHolder();
holder.contactAvatar = (ImageView) view.findViewById(R.id.contact_avatar);
holder.typeIcon = (ImageView) view.findViewById(R.id.type_icon);
holder.displayName = (TextView) view.findViewById(R.id.display_name);
holder.view = view;
if (isEnableIconShadow) {
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(final View view, MotionEvent motionEvent) {
if (view == null || motionEvent == null) {
return false;
}
int action = motionEvent.getAction();
if (action != MotionEvent.ACTION_DOWN) {
return false;
}
if (mIconTouchedAnim != null) {
mIconTouchedAnim.cancel();
}
view.setAlpha(0.4f);
mIconTouchedAnim = new Anim(view, Anim.TRANSPARENT, 100, Anim.CUBIC_OUT, new Vector3f(0, 0, 0.4f), new Vector3f(0, 0, 1));
mIconTouchedAnim.setListener(new AnimListener() {
@Override
public void onStart() {
}
@Override
public void onComplete(int type) {
if (mIconTouchedAnim != null) {
view.setAlpha(1);
mIconTouchedAnim = null;
}
}
});
mIconTouchedAnim.setDelay(200);
mIconTouchedAnim.start();
return false;
}
});
}
view.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.restore();
boolean isLeftMode = SidebarController.getInstance(mContext).getSidebarMode() == SidebarMode.MODE_LEFT;
holder.setItem(item, mDragEvent != null, isLeftMode);
Utils.setAlwaysCanAcceptDrag(holder.view, mDragEvent != null);
holder.view.setOnDragListener(new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
ViewHolder vh = (ViewHolder) v.getTag();
final int action = event.getAction();
switch (action) {
case DragEvent.ACTION_DRAG_STARTED:
return mDragEvent != null;
case DragEvent.ACTION_DRAG_ENTERED:
FloatText.getInstance(mContext).show(holder.view, holder.mItem.getDisplayName());
vh.view.animate().scaleX(SCALE_SIZE).scaleY(SCALE_SIZE)
.setInterpolator(new AccelerateDecelerateInterpolator())
.setStartDelay(0)
.setDuration(100).start();
return true;
case DragEvent.ACTION_DRAG_EXITED:
FloatText.getInstance(mContext).hide();
vh.view.animate().scaleX(1.0f).scaleY(1.0f).setDuration(100).start();
return true;
case DragEvent.ACTION_DRAG_LOCATION:
return true;
case DragEvent.ACTION_DROP:
vh.view.animate().scaleX(1.0f).scaleY(1.0f).setDuration(100).start();
boolean ret = vh.mItem.handleDragEvent(mContext, event);
if(ret){
Utils.dismissAllDialog(mContext);
}
return ret;
case DragEvent.ACTION_DRAG_ENDED:
return true;
}
return false;
}
});
return holder.view;
}
public static class ViewHolder {
public View view;
public ImageView contactAvatar;
public ImageView typeIcon;
public TextView displayName;
public ContactItem mItem;
public void setItem(ContactItem item, boolean dragging, boolean isLeftMode) {
mItem = item;
if (item == null) {
return;
}
typeIcon.setImageResource(item.getTypeIcon());
displayName.setText(item.getDisplayName());
contactAvatar.setImageDrawable(mItem.getAvatar());
if(dragging) {
contactAvatar.setScaleX(0.8f);
contactAvatar.setScaleY(0.8f);
displayName.setVisibility(View.VISIBLE);
} else {
contactAvatar.setScaleX(1);
contactAvatar.setScaleY(1);
displayName.setVisibility(View.GONE);
}
}
public void restore(){
if (view.getVisibility() == View.INVISIBLE) {
view.setVisibility(View.VISIBLE);
}
view.setTranslationY(0);
}
}
public int objectIndex(ContactItem item) {
if (item == null) {
return -1;
}
if (mContacts == null) {
return -1;
}
return mContacts.indexOf(item);
}
private void onOrderChange(){
for(int i = 0; i < mContacts.size(); ++ i){
mContacts.get(i).setIndex(mContacts.size() - 1 - i);
}
mManager.updateOrder();
}
public void dumpAdapter() {
if (mContacts == null) {
return;
}
int count = mContacts.size();
for (int i = 0; i < count; i++) {
ContactItem item = mContacts.get(i);
log.error("contact item index ["+i+"], name ["+item.getDisplayName()+"]");
}
}
}