package eu.ttbox.androgister.ui.admin.offer; import android.content.ClipData; import android.content.ClipData.Item; import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; import android.support.v4.view.MotionEventCompat; import android.support.v4.view.VelocityTrackerCompat; import android.util.Log; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.View.DragShadowBuilder; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.widget.TextView; import de.greenrobot.dao.query.LazyList; import eu.ttbox.androgister.R; import eu.ttbox.androgister.core.PriceHelper; import eu.ttbox.androgister.domain.CatalogProduct; import eu.ttbox.androgister.domain.Product; import eu.ttbox.androgister.domain.core.LazyListAdapter; import eu.ttbox.androgister.domain.provider.ProductProvider; import eu.ttbox.androgister.ui.admin.offer.CatalogProductListAdapter.ViewHolder; import eu.ttbox.androgister.ui.admin.product.ProductUiHelper; public class CatalogProductListAdapter extends LazyListAdapter<CatalogProduct, ViewHolder> { private static final String TAG = "CatalogProductListAdapter"; private Context context; private ProductUiHelper productColor; private GestureListener gestureListener = new GestureListener(); // =========================================================== // Constructor // =========================================================== public CatalogProductListAdapter(Context context, LazyList<CatalogProduct> lazyList) { super(context, R.layout.admin_product_list_item, lazyList); this.context = context; this.productColor = new ProductUiHelper(context); } // =========================================================== // Bindings // =========================================================== @Override public void bindView(View view, ViewHolder holder, Context context, CatalogProduct item) { Product product = item.getProduct(); holder.nameText.setText(product.getName()); String priceString = PriceHelper.getToStringPrice(product.getPriceHT()); holder.priceText.setText(priceString); // Color Drawable grad = productColor.getStateGradientDrawable(product.getTag().getColor()); view.setBackgroundDrawable(grad); // Listener view.setOnTouchListener(gestureListener); // view.setOn } @Override public ViewHolder newViewHolder(View view, Context context, CatalogProduct item, ViewGroup parent) { ViewHolder holder = new ViewHolder(); holder.nameText = (TextView) view.findViewById(R.id.product_list_item_name); holder.priceText = (TextView) view.findViewById(R.id.product_list_item_price); return holder; } static class ViewHolder { TextView nameText; TextView priceText; } // =========================================================== // Gesture Listener // =========================================================== // http://mobile.tutsplus.com/tutorials/android/android-sdk-implementing-drag-and-drop-functionality/ private class ListGestureListener extends SimpleOnGestureListener { private View view; public ListGestureListener(View view) { super(); this.view = view; } public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { if (distanceX > distanceY) { return startDrag(view, e1); } return false; } } /** * http://developer.android.com/training/gestures/movement.html */ private class GestureListener implements OnTouchListener { private VelocityTracker mVelocityTracker = null; @Override public boolean onTouch(View view, MotionEvent event) { // dumpEvent(event); int action = MotionEventCompat.getActionMasked(event); int index = MotionEventCompat.getActionIndex(event); int pointerId = MotionEventCompat.getPointerId(event, index); switch (action) { case MotionEvent.ACTION_DOWN: if (mVelocityTracker == null) { // Retrieve a new VelocityTracker object to watch the // velocity of a motion. mVelocityTracker = VelocityTracker.obtain(); } else { // Reset the velocity tracker back to its initial state. mVelocityTracker.clear(); } Log.d(TAG, "PointerCount : " + MotionEventCompat.getPointerCount(event)); // Add a user's movement to the tracker. mVelocityTracker.addMovement(event); return true; // break; case MotionEvent.ACTION_MOVE: mVelocityTracker.addMovement(event); // When you want to determine the velocity, call // computeCurrentVelocity(). Then call getXVelocity() // and getYVelocity() to retrieve the velocity for each pointer // ID. mVelocityTracker.computeCurrentVelocity(1000); // Log velocity of pixels per second // Best practice to use VelocityTrackerCompat where possible. // Log.d("", "Velocity (X,Y): " + // VelocityTrackerCompat.getXVelocity(mVelocityTracker, // pointerId) + " , " + // VelocityTrackerCompat.getYVelocity(mVelocityTracker, // pointerId)); float veloX = Math.abs(VelocityTrackerCompat.getXVelocity(mVelocityTracker, pointerId)); float veloY = Math.abs(VelocityTrackerCompat.getYVelocity(mVelocityTracker, pointerId)); if (veloX > veloY) { return startDrag(view, event); } // return true; break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: // Return a VelocityTracker object back to be re-used by others. mVelocityTracker.recycle(); break; case MotionEvent.ACTION_POINTER_DOWN: Log.d(TAG, "GestureListener ignore action ACTION_POINTER_DOWN : " + event.getAction()); Log.d(TAG, "PointerCount : " + MotionEventCompat.getPointerCount(event)); break; default: Log.d(TAG, "GestureListener ignore action : " + event.getAction()); return false; } return false; } } private boolean startDrag(View view, MotionEvent event) { Long productId = null; // item.getProductId(); Intent intent = new Intent(Intent.ACTION_INSERT + ".Product"); intent.putExtra(Intent.EXTRA_UID, productId); // ClipData String label = "Product Catalog"; String[] mimeTypes = new String[] { ProductProvider.PRODUCT_MIME_TYPE }; Item item = new Item(intent); ClipData data = new ClipData(label, mimeTypes, item); // ClipData data = ClipData.newIntent("Product", intent); DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); view.startDrag(data, shadowBuilder, (Object) view, 0); return true; } }