package com.smartisanos.sidebar.view; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.graphics.drawable.Drawable; 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.ImageView; import com.smartisanos.sidebar.R; import com.smartisanos.sidebar.SidebarController; import com.smartisanos.sidebar.SidebarMode; import com.smartisanos.sidebar.util.Constants; import com.smartisanos.sidebar.util.LOG; import com.smartisanos.sidebar.util.ResolveInfoGroup; import com.smartisanos.sidebar.util.ResolveInfoManager; import com.smartisanos.sidebar.util.Utils; import com.smartisanos.sidebar.util.anim.AnimStatusManager; public class ResolveInfoListAdapter extends SidebarAdapter { private static final LOG log = LOG.getInstance(ResolveInfoListAdapter.class); private static final float SCALE_SIZE = 1.4f; private Context mContext; private SidebarListView mListView; private List<ResolveInfoGroup> mResolveInfos; private List<ResolveInfoGroup> mAcceptableResolveInfos = new ArrayList<ResolveInfoGroup>(); private DragEvent mDragEvent; private ResolveInfoManager mManager; private boolean mPendingUpdate = false; public ResolveInfoListAdapter(Context context, SidebarListView listView) { mContext = context; mListView = listView; mManager = ResolveInfoManager.getInstance(context); mResolveInfos = mManager.getAddedResolveInfoGroup(); mAcceptableResolveInfos.addAll(mResolveInfos); mManager.addListener(resolveInfoUpdateListener); AnimStatusManager.getInstance().addAnimFlagStatusChangedListener( AnimStatusManager.SIDEBAR_ITEM_DRAGGING, new AnimStatusManager.AnimFlagStatusChangedListener() { @Override public void onChanged() { if (mPendingUpdate) { updateData(); } } }); } private ResolveInfoManager.ResolveInfoUpdateListener resolveInfoUpdateListener = new ResolveInfoManager.ResolveInfoUpdateListener() { @Override public void onUpdate() { new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { mListView.animWhenDatasetChange(); } }); } }; public void updateData() { new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { if (AnimStatusManager.getInstance() .canUpdateSidebarList()) { mResolveInfos = mManager.getAddedResolveInfoGroup(); updateAcceptableResolveInfos(); mPendingUpdate = false; } else { mPendingUpdate = true; } } }); } private void updateAcceptableResolveInfos() { mAcceptableResolveInfos.clear(); for (ResolveInfoGroup rig : mResolveInfos) { if (mDragEvent == null || rig.acceptDragEvent(mContext, mDragEvent)) { mAcceptableResolveInfos.add(rig); } } notifyDataSetChanged(); } @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 int getCount() { return mAcceptableResolveInfos.size(); } @Override public Object getItem(int position) { return mAcceptableResolveInfos.get(position); } @Override public long getItemId(int position) { return position; } @Override public void moveItemPostion(Object object, int index) { ResolveInfoGroup item = (ResolveInfoGroup)object; if (index < 0) { index = 0; } if (index >= mResolveInfos.size()) { index = mResolveInfos.size() - 1; } int now = mResolveInfos.indexOf(item); if (now == -1 || now == index) { return; } mResolveInfos.remove(item); mResolveInfos.add(index, item); onOrderChange(); } private void onOrderChange() { for(int i = 0; i < mResolveInfos.size(); ++ i){ mResolveInfos.get(i).setIndex(mResolveInfos.size() - 1 - i); } mManager.updateOrder(); } @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder holder; ResolveInfoGroup resolveInfoGroup = mAcceptableResolveInfos.get(position); if (convertView == null) { View view = LayoutInflater.from(mContext).inflate(R.layout.shareitem, null); ImageView iconInputDragLeft = (ImageView) view.findViewById(R.id.icon_input_drag_left); ImageView iconInputDragRight = (ImageView) view.findViewById(R.id.icon_input_drag_right); ImageView iconImage = (ImageView) view.findViewById(R.id.shareitemimageview); holder = new ViewHolder(); holder.view = view; holder.context = mContext; holder.iconInputDragLeft = iconInputDragLeft; holder.iconInputDragRight = iconInputDragRight; holder.iconImageView = iconImage; view.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.restore(); boolean isLeftMode = SidebarController.getInstance(mContext).getSidebarMode() == SidebarMode.MODE_LEFT; holder.setInfo(resolveInfoGroup, isLeftMode); Utils.setAlwaysCanAcceptDrag(holder.view, true); holder.view.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 true; case DragEvent.ACTION_DRAG_ENTERED: FloatText.getInstance(mContext).show(holder.view, holder.resolveInfoGroup.getDisplayName()); holder.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(); holder.view.animate().scaleX(1.0f).scaleY(1.0f).setDuration(100).start(); return true; case DragEvent.ACTION_DRAG_LOCATION: // log.d("ACTION_DRAG_LOCATION"); return true; case DragEvent.ACTION_DROP: // log.d("ACTION_DRAG_DROP"); holder.view.animate().scaleX(1.0f).scaleY(1.0f).setDuration(100).start(); return holder.resolveInfoGroup.handleDragEvent(mContext, event); case DragEvent.ACTION_DRAG_ENDED: return true; } return false; } }); return holder.view; } public int objectIndex(ResolveInfoGroup data) { if (mResolveInfos == null) { return -1; } return mResolveInfos.indexOf(data); } public static class ViewHolder { public View view; public Context context; public ImageView iconInputDragLeft; public ImageView iconInputDragRight; public ImageView iconImageView; public Drawable icon; public ResolveInfoGroup resolveInfoGroup; public boolean isNewAdded = false; public void setInfo(ResolveInfoGroup info, boolean isLeftMode) { resolveInfoGroup = info; if (info == null) { return; } iconImageView.setImageDrawable(resolveInfoGroup.getAvatar()); int offsetX = Constants.share_item_offset_x; if (isLeftMode) { offsetX = -offsetX; } iconImageView.setTranslationX(offsetX); iconImageView.setTranslationY(Constants.share_item_offset_y); iconImageView.setScaleX(0.8f); iconImageView.setScaleY(0.8f); if (isLeftMode) { iconInputDragLeft.setVisibility(View.INVISIBLE); iconInputDragRight.setVisibility(View.VISIBLE); } else { iconInputDragRight.setVisibility(View.INVISIBLE); iconInputDragLeft.setVisibility(View.VISIBLE); } } public void restore(){ if (view.getVisibility() == View.INVISIBLE) { view.setVisibility(View.VISIBLE); } view.setTranslationY(0); } } }