// NOTE: This method is called from RecyclerViewDragDropManager
  /*package*/ void onDragItemFinished(RecyclerView.ViewHolder holder, boolean result) {
    if (LOCAL_LOGD) {
      Log.d(TAG, "onDragItemFinished(holder = " + holder + ", result = " + result + ")");
    }

    if (holder != null && holder != mDraggingItem) {
      throw new IllegalStateException(
          "onDragItemFinished() - may be a bug (mDraggingItem != holder)");
    }

    if (DEBUG_BYPASS_MOVE_OPERATION_MODE) {
      return;
    }

    if (result && (mDraggingItemCurrentPosition != mDraggingItemInitialPosition)) {
      // apply to wrapped adapter
      DraggableItemAdapter adapter =
          WrapperAdapterUtils.findWrappedAdapter(getWrappedAdapter(), DraggableItemAdapter.class);
      adapter.onMoveItem(mDraggingItemInitialPosition, mDraggingItemCurrentPosition);
    }

    mDraggingItemInitialPosition = RecyclerView.NO_POSITION;
    mDraggingItemCurrentPosition = RecyclerView.NO_POSITION;
    mDraggableRange = null;
    mDraggingItemId = RecyclerView.NO_ID;
    mDraggingItem = null;

    notifyDataSetChanged();
  }
 /*package*/
 @SuppressWarnings("unchecked")
 ItemDraggableRange getItemDraggableRange(RecyclerView.ViewHolder holder, int position) {
   if (LOCAL_LOGV) {
     Log.v(TAG, "getItemDraggableRange(holder = " + holder + ", position = " + position + ")");
   }
   return mDraggableItemAdapter.onGetItemDraggableRange(holder, position);
 }
 /*package*/
 @SuppressWarnings("unchecked")
 boolean canStartDrag(RecyclerView.ViewHolder holder, int position, int x, int y) {
   if (LOCAL_LOGV) {
     Log.v(
         TAG,
         "canStartDrag(holder = "
             + holder
             + ", position = "
             + position
             + ", x = "
             + x
             + ", y = "
             + y
             + ")");
   }
   return mDraggableItemAdapter.onCheckCanStartDrag(holder, position, x, y);
 }
  // NOTE: This method is called from RecyclerViewDragDropManager
  /*package*/ void moveItem(int fromPosition, int toPosition) {
    if (LOCAL_LOGD) {
      Log.d(
          TAG, "onMoveItem(fromPosition = " + fromPosition + ", toPosition = " + toPosition + ")");
    }

    if (DEBUG_BYPASS_MOVE_OPERATION_MODE) {
      mDraggableItemAdapter.onMoveItem(fromPosition, toPosition);
      return;
    }

    final int origFromPosition =
        convertToOriginalPosition(
            fromPosition, mDraggingItemInitialPosition, mDraggingItemCurrentPosition);

    if (origFromPosition != mDraggingItemInitialPosition) {
      throw new IllegalStateException(
          "onMoveItem() - may be a bug or has duplicate IDs  --- "
              + "mDraggingItemInitialPosition = "
              + mDraggingItemInitialPosition
              + ", "
              + "mDraggingItemCurrentPosition = "
              + mDraggingItemCurrentPosition
              + ", "
              + "origFromPosition = "
              + origFromPosition
              + ", "
              + "fromPosition = "
              + fromPosition
              + ", "
              + "toPosition = "
              + toPosition);
    }

    mDraggingItemCurrentPosition = toPosition;

    // NOTE:
    // Don't move items in wrapped adapter here.

    // notify to observers
    notifyItemMoved(fromPosition, toPosition);
  }