package com.smartisanos.sidebar.view;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.view.DragEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.TextView;
import com.smartisanos.sidebar.R;
import com.smartisanos.sidebar.util.OngoingItem;
import com.smartisanos.sidebar.util.OngoingManager;
import com.smartisanos.sidebar.util.Utils;
public class OngoingAdapter extends SidebarAdapter {
private static final float SCALE_SIZE = 1.4f;
private Context mContext;
private OngoingManager mManager;
private List<OngoingItem> mList;
private List<OngoingItem> mAccpetableList = new ArrayList<OngoingItem>();
private Handler mHandler;
private DragEvent mDragEvent;
public OngoingAdapter(Context context) {
mContext = context;
mManager = OngoingManager.getInstance(mContext);
mList = mManager.getList();
mAccpetableList.addAll(mList);
mHandler = new Handler(Looper.getMainLooper());
mManager.addListener(new OngoingManager.RecentUpdateListener() {
@Override
public void onUpdate() {
updateData();
}
});
}
@Override
public int getCount() {
return mAccpetableList.size();
}
@Override
public Object getItem(int position) {
return mAccpetableList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View ret = convertView;
if (ret == null) {
ret = LayoutInflater.from(mContext).inflate(R.layout.ongoing_item, null);
ViewHolder vh = new ViewHolder();
vh.pendingNumbers = (TextView) ret.findViewById(R.id.pending_numbers);
ret.setTag(vh);
}
ViewHolder vh = (ViewHolder) ret.getTag();
vh.item = mAccpetableList.get(position);
vh.updateUI();
Utils.setAlwaysCanAcceptDrag(ret, mDragEvent != null);
ret.setOnDragListener(new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
final int action = event.getAction();
switch (action) {
case DragEvent.ACTION_DRAG_STARTED:
return mDragEvent != null;
case DragEvent.ACTION_DRAG_ENTERED:
v.animate().scaleX(SCALE_SIZE).scaleY(SCALE_SIZE)
.setInterpolator(new AccelerateDecelerateInterpolator())
.setStartDelay(0).setDuration(100).start();
return true;
case DragEvent.ACTION_DRAG_EXITED:
v.animate().scaleX(1.0f).scaleY(1.0f).setDuration(100).start();
return true;
case DragEvent.ACTION_DRAG_LOCATION:
return true;
case DragEvent.ACTION_DROP:
v.animate().scaleX(1.0f).scaleY(1.0f).setDuration(100).start();
ViewHolder vh = (ViewHolder) v.getTag();
return vh.item.handleDragEvent(mContext, event);
case DragEvent.ACTION_DRAG_ENDED:
return true;
}
return false;
}
});
ret.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ViewHolder vh = (ViewHolder) v.getTag();
vh.item.openUI(mContext);
}
});
return ret;
}
private void updateAcceptableList() {
mAccpetableList.clear();
for (OngoingItem item : mList) {
if (mDragEvent == null || item.acceptDragEvent(mContext, mDragEvent)) {
mAccpetableList.add(item);
}
}
notifyDataSetChanged();
}
@Override
public void moveItemPostion(Object object, int index) {
// NA
}
@Override
public void onDragStart(DragEvent event) {
if (mDragEvent != null) {
mDragEvent.recycle();
mDragEvent = null;
}
mDragEvent = DragEvent.obtain(event);
updateAcceptableList();
}
@Override
public void onDragEnd() {
if (mDragEvent == null) {
return;
}
mDragEvent.recycle();
mDragEvent = null;
updateAcceptableList();
}
@Override
public void updateData() {
mHandler.post(new Runnable() {
@Override
public void run() {
mList = mManager.getList();
updateAcceptableList();
}
});
}
class ViewHolder {
public TextView pendingNumbers;
public OngoingItem item;
public void updateUI() {
if (item.getPendingNumbers() <= 0) {
pendingNumbers.setVisibility(View.INVISIBLE);
} else {
pendingNumbers.setVisibility(View.VISIBLE);
pendingNumbers.setText("" + item.getPendingNumbers());
}
}
}
}