/*
* ******************************************************************************
* Copyright (c) 2013-2014 Gabriele Mariotti.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* *****************************************************************************
*/
package it.gmariotti.cardslib.library.internal;
import android.content.Context;
import android.database.Cursor;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import it.gmariotti.cardslib.library.R;
import it.gmariotti.cardslib.library.internal.base.BaseCardCursorAdapter;
import it.gmariotti.cardslib.library.view.CardListView;
import it.gmariotti.cardslib.library.view.base.CardViewWrapper;
/**
* Cursor Adapter for {@link it.gmariotti.cardslib.library.internal.Card} model
*
*
* </p>
* @author Gabriele Mariotti (gabri.mariotti@gmail.com)
*/
public abstract class CardCursorAdapter extends BaseCardCursorAdapter {
protected static String TAG = "CardCursorAdapter";
/**
* {@link it.gmariotti.cardslib.library.view.CardListView}
*/
protected CardListView mCardListView;
/**
* Internal Map with all Cards.
* It uses the card id value as key.
*/
protected HashMap<String /* id */,Card> mInternalObjects;
/**
* All ids expanded
*/
protected final List<String> mExpandedIds;
/**
* Recycle
*/
protected boolean recycle = false;
// -------------------------------------------------------------
// Constructors
// -------------------------------------------------------------
public CardCursorAdapter(Context context) {
super(context, null, 0);
mExpandedIds = new ArrayList<String>();
}
protected CardCursorAdapter(Context context, Cursor c, boolean autoRequery) {
super(context, c, autoRequery);
mExpandedIds = new ArrayList<String>();
}
protected CardCursorAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
mExpandedIds = new ArrayList<String>();
}
// -------------------------------------------------------------
// Views
// -------------------------------------------------------------
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//Check for recycle
if (convertView == null) {
recycle = false;
} else {
recycle = true;
}
return super.getView(position, convertView, parent);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
int layout = mRowLayoutId;
LayoutInflater mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
return mInflater.inflate(layout, parent, false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
CardViewWrapper mCardView;
Card mCard;
mCard = (Card) getCardFromCursor(cursor);
if (mCard != null) {
mCardView = (CardViewWrapper) view.findViewById(R.id.list_cardId);
if (mCardView != null) {
//It is important to set recycle value for inner layout elements
mCardView.setForceReplaceInnerLayout(Card.equalsInnerLayout(mCardView.getCard(),mCard));
//It is important to set recycle value for performance issue
mCardView.setRecycle(recycle);
//Save original swipeable to prevent cardSwipeListener (listView requires another cardSwipeListener)
boolean origianlSwipeable = mCard.isSwipeable();
mCard.setSwipeable(false);
mCard.setExpanded(isExpanded(mCard));
mCardView.setCard(mCard);
//Set originalValue
//mCard.setSwipeable(origianlSwipeable);
if (origianlSwipeable)
Log.d(TAG, "Swipe action not enabled in this type of view");
//If card has an expandable button override animation
if ((mCard.getCardHeader() != null && mCard.getCardHeader().isButtonExpandVisible()) || mCard.getViewToClickToExpand()!=null ){
setupExpandCollapseListAnimation(mCardView);
}
//Setup swipeable animation
setupSwipeableAnimation(mCard, mCardView);
//setupMultiChoice
setupMultichoice(view,mCard,mCardView,cursor.getPosition());
}
}
}
/**
* Sets SwipeAnimation on List
*
* @param card {@link it.gmariotti.cardslib.library.internal.Card}
* @param cardView {@link it.gmariotti.cardslib.library.view.CardView}
*/
protected void setupSwipeableAnimation(final Card card, CardViewWrapper cardView) {
cardView.setOnTouchListener(null);
}
/**
* Overrides the default collapse/expand animation in a List
*
* @param cardView {@link it.gmariotti.cardslib.library.view.CardView}
*/
protected void setupExpandCollapseListAnimation(CardViewWrapper cardView) {
if (cardView == null) return;
cardView.setOnExpandListAnimatorListener(mCardListView);
}
// -------------------------------------------------------------
// Expanded
// -------------------------------------------------------------
/**
* Set the card as Expanded.
*/
public void setExpanded(Card card) {
if (card!=null)
setExpanded(card.getId());
}
/**
* Set the card as Expanded using its id
*/
public void setExpanded(final String id) {
if (mExpandedIds!=null){
if (mExpandedIds.contains(id)) {
return;
}
mExpandedIds.add(id);
}
}
/**
* Set the card as collapsed
*/
public void setCollapsed(Card card) {
if (card!=null)
setCollapsed(card.getId());
}
/**
* Set the card as collapsed using its id
*/
public void setCollapsed(final String id) {
if (mExpandedIds!=null){
if (!mExpandedIds.contains(id)) {
return;
}
mExpandedIds.remove(id);
}
}
/**
* Indicates if the item at the specified position is expanded.
*
* @param card
* @return true if the view is expanded, false otherwise.
*/
public boolean isExpanded(Card card) {
String itemId = card.getId();
return mExpandedIds.contains(itemId);
}
/**
* Checks if the item is already expanded
*
* @param viewCard
* @return
*/
public boolean onExpandStart(CardViewWrapper viewCard) {
Card card = viewCard.getCard();
if (card!=null){
String itemId = card.getId();
if (!mExpandedIds.contains(itemId)) {
return true;
}
}
return false;
}
/**
* * Checks if the item is already collapsed
*
* @param viewCard
* @return
*/
public boolean onCollapseStart(CardViewWrapper viewCard) {
Card card = viewCard.getCard();
if (card!=null){
String itemId = card.getId();
if (mExpandedIds.contains(itemId)) {
return true;
}
}
return false;
}
/**
* Updates the mExpandedIds after an expand action
*
* @param viewCard
*/
public void onExpandEnd(CardViewWrapper viewCard) {
Card card = viewCard.getCard();
if (card!=null){
setExpanded(card);
}
}
/**
* Updates the mExpandedIds after a collapse action
*
* @param viewCard
*/
public void onCollapseEnd(CardViewWrapper viewCard) {
Card card = viewCard.getCard();
if (card!=null){
setCollapsed(card);
}
}
// -------------------------------------------------------------
// Getters and Setters
// -------------------------------------------------------------
/**
* @return {@link it.gmariotti.cardslib.library.view.CardListView}
*/
public CardListView getCardListView() {
return mCardListView;
}
/**
* Sets the {@link it.gmariotti.cardslib.library.view.CardListView}
*
* @param cardListView cardListView
*/
public void setCardListView(CardListView cardListView) {
this.mCardListView = cardListView;
}
/**
* Returns the expanded ids
*
* @return
*/
public List<String> getExpandedIds() {
return mExpandedIds;
}
}