package eu.ttbox.androgister.ui.admin.offer; import java.util.ArrayList; import android.content.ClipData; import android.content.Context; import android.content.Intent; import android.graphics.Canvas; import android.os.Bundle; import android.support.v4.view.MotionEventCompat; import android.util.AttributeSet; import android.util.Log; import android.view.ActionMode; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.View.DragShadowBuilder; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.GridView; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.Toast; import de.greenrobot.dao.query.LazyList; import de.greenrobot.dao.query.QueryBuilder; import eu.ttbox.androgister.R; import eu.ttbox.androgister.core.CoreHelper; import eu.ttbox.androgister.domain.CatalogProduct; import eu.ttbox.androgister.domain.CatalogProductDao; import eu.ttbox.androgister.domain.CatalogProductDao.Properties; import eu.ttbox.androgister.domain.core.LazyListAdapter; import eu.ttbox.androgister.ui.core.crud.EntityLazyListFragment; public class CatalogProductListFragment extends EntityLazyListFragment<CatalogProduct, CatalogProductDao> { private static final String TAG = "CatalogProductListFragment"; private GridView listView; // Instance private Long catalogId; // =========================================================== // Constructor // =========================================================== // http://developer.android.com/training/gestures/viewgroup.html private class TouchGridView extends GridView { private boolean mIsScrolling; private int mTouchSlop; // public TouchGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public TouchGridView(Context context, AttributeSet attrs) { super(context, attrs); } public TouchGridView(Context context) { super(context); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { final int action = MotionEventCompat.getActionMasked(ev); // Always handle the case of the touch gesture being complete. if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) { // Release the scroll. mIsScrolling = false; return false; // Do not intercept touch event, let the child // handle it } switch (action) { case MotionEvent.ACTION_MOVE: { if (mIsScrolling) { // We're currently scrolling, so yes, intercept the // touch event! return true; } // If the user has dragged her finger horizontally more than // the touch slop, start the scroll // left as an exercise for the reader final boolean xDiff = calculateDistanceX(ev); // Touch slop should be calculated using ViewConfiguration // constants. if (xDiff ) { // Start scrolling! mIsScrolling = true; return true; } break; } } return false; } private boolean calculateDistanceX(MotionEvent ev) { float dx = Math.abs( ev.getHistoricalX(0) - ev.getX()); float dy =Math.abs( ev.getHistoricalY(0) - ev.getY()); if (dx>dy && dx >20) { // return start return true; } return false; } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.admin_offer_creator, container, false); // Binding listView = (GridView) v.findViewById(R.id.calalog_product_gridview); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); listView.setMultiChoiceModeListener(new ModeCallback()); // listView.setOnItemClickListener(new DragAndDropListener()); // listView.setOnItemLongClickListener(new DragAndDropListener()); // listView.setOnTouchListener(new GestureListener()); return v; } @Override public AdapterView<ListAdapter> getAdapterContainer() { return listView; } // =========================================================== // Gesture Listener // =========================================================== // http://mobile.tutsplus.com/tutorials/android/android-sdk-implementing-drag-and-drop-functionality/ private class GestureListener implements OnTouchListener { @Override public boolean onTouch(View view, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { // setup drag // CatalogProduct item = (CatalogProduct) // parent.getItemAtPosition(position); Long productId = null; // item.getProductId(); Intent intent = new Intent(Intent.ACTION_INSERT + ".Product"); intent.putExtra(Intent.EXTRA_UID, productId); ClipData data = ClipData.newIntent("Product", intent); DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); view.startDrag(data, shadowBuilder, (Object) view, 0); return true; } return false; } } // =========================================================== // Multi Choice Listener // =========================================================== // http://developer.android.com/guide/topics/ui/drag-drop.html private class DragAndDropListener implements OnItemLongClickListener, OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // Create a new ClipData.Item from the ImageView object's tag // ClipData.Item item = new ClipData.Item("Tag"); // ClipData dragData = new // ClipData(v.getTag(),ClipData.MIMETYPE_TEXT_PLAIN,item); CatalogProduct item = (CatalogProduct) parent.getItemAtPosition(position); Long productId = item.getProductId(); Intent intent = new Intent(Intent.ACTION_INSERT + ".Product"); intent.putExtra(Intent.EXTRA_UID, productId); ClipData data = ClipData.newIntent("Product", intent); DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); view.startDrag(data, new ANRShadowBuilder(view), (Object) view, 0); } @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { onItemClick(parent, view, position, id); return true; } // Shadow builder that can ANR if desired class ANRShadowBuilder extends DragShadowBuilder { public ANRShadowBuilder(View view) { super(view); } @Override public void onDrawShadow(Canvas canvas) { super.onDrawShadow(canvas); } } } // =========================================================== // Multi Choice Listener // =========================================================== private class ModeCallback implements ListView.MultiChoiceModeListener { public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.admin_list_select_menu, menu); mode.setTitle(getResources().getString(R.string.item_selected_title)); return true; } public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return true; } public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.menu_admin_edit_delete: deleteSelectedItems(); mode.finish(); // Action picked, so close the CAB return true; default: Toast.makeText(getActivity(), "Clicked " + item.getTitle(), Toast.LENGTH_SHORT).show(); break; } return true; } public void onDestroyActionMode(ActionMode mode) { } public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { final int checkedCount = listView.getCheckedItemCount(); switch (checkedCount) { case 0: mode.setSubtitle(null); break; default: String subtitlesSelected = getResources().getQuantityString(R.plurals.item_selected, checkedCount, checkedCount); mode.setSubtitle(subtitlesSelected); break; } } } // =========================================================== // Service // =========================================================== @Override public CatalogProductDao getEntityDao() { return getDaoSession().getCatalogProductDao(); } @Override public LazyListAdapter<CatalogProduct, ? extends Object> createListAdapter(LazyList<CatalogProduct> lazyList) { return new CatalogProductListAdapter(getActivity(), lazyList); } @Override public QueryBuilder<CatalogProduct> createSearchQuery(CatalogProductDao entityDao) { QueryBuilder<CatalogProduct> query = entityDao.queryBuilder(); // if (catalogId != null) { query.where(Properties.CatalogId.eq(catalogId)); } // .orderAsc(Properties.Name); // ; // query. return query; } // =========================================================== // Action // =========================================================== @Override public void onEntityClick(Long id) { // TODO Auto-generated method stub } private void deleteSelectedItems() { long[] checkedIds = listView.getCheckedItemIds(); Long[] catProdIds = CoreHelper.convertToLongArray(checkedIds); deleteSelectedItems(catProdIds); } private void deleteSelectedItems(Long... catProdIds) { if (catProdIds != null && catProdIds.length > 0) { entityDao.deleteByKeyInTx(catProdIds); reloadData(); } } public void onSelectCalalogId(Long catalogId) { Log.d(TAG, "Select Catalog Id : " + catalogId); this.catalogId = catalogId; reloadData(); } public void onSelectProductId(Long[] productIds) { if (catalogId == null) { Log.w(TAG, "onSelectProductId : No Catlog Selected"); } else { ArrayList<CatalogProduct> toInsert = new ArrayList<CatalogProduct>(productIds.length); for (Long productId : productIds) { CatalogProduct catProd = new CatalogProduct(); catProd.setCatalogId(catalogId); catProd.setProductId(productId); toInsert.add(catProd); } entityDao.insertOrReplaceInTx(toInsert); reloadData(); } } }