diff options
| author | Lars Greiss <kufikugel@googlemail.com> | 2014-03-15 20:38:03 +0100 |
|---|---|---|
| committer | Lars Greiss <kufikugel@googlemail.com> | 2014-03-16 14:43:20 +0100 |
| commit | 5c1c7c2c3613f1ef6ab42dc5c6e89e24f7b80fcd (patch) | |
| tree | 2b31a3cf327355e12c009f68ac4c877d733da90b | |
| parent | d64cbea17ae4f3a0f865f6fc4841b55a709c8110 (diff) | |
Cardslib: Add partial onLongClickListener ability
Adds the ability like the partial click listeners to add partial
onLongClickListener per view.
As well this commit adds the expanded area as possible partial clickable area.
ToDo: This change should be reflected to gridview and the logic change should be adapted
to the partial clicklistener to allow global click events and partial at the same time
(see new implementation of partial onLongLickListener partial)
Change-Id: If701eba1724c232890d66d70785bbc883be104a6
| -rw-r--r-- | src/com/android/cards/internal/Card.java | 85 | ||||
| -rw-r--r-- | src/com/android/cards/internal/CardArrayAdapter.java | 21 | ||||
| -rw-r--r-- | src/com/android/cards/view/CardView.java | 170 |
3 files changed, 215 insertions, 61 deletions
diff --git a/src/com/android/cards/internal/Card.java b/src/com/android/cards/internal/Card.java index 9386599..1d464f1 100644 --- a/src/com/android/cards/internal/Card.java +++ b/src/com/android/cards/internal/Card.java @@ -130,6 +130,11 @@ public class Card extends BaseCard { protected HashMap<Integer, OnCardClickListener> mMultipleOnClickListener; /** + * Partial OnClickListener + */ + protected HashMap<Integer, OnLongCardClickListener> mMultipleOnLongClickListener; + + /** * Global area * It is used by partial click listener */ @@ -148,6 +153,12 @@ public class Card extends BaseCard { public static final int CLICK_LISTENER_HEADER_VIEW = 2; /** + * Expand Area + * It is used by partial click listener + */ + public static final int CLICK_LISTENER_EXPAND_VIEW = 3; + + /** * Content Main area. It is used by partial click listener */ @@ -681,15 +692,19 @@ public class Card extends BaseCard { /** * Indicates if the card is long clickable - * If card hasn't a {@link OnLongCardClickListener} return <code>false</code> in any cases. + * If card hasn't a {@link OnLongCardClickListener} + * or any partial Listener return <code>true</code> in any cases. * * @return */ public boolean isLongClickable() { - if (mOnLongClickListener == null) { - if (mIsLongClickable) + if (mIsLongClickable) { + if (mOnLongClickListener == null + && (mMultipleOnLongClickListener == null + || mMultipleOnLongClickListener.isEmpty())) { Log.w(TAG, "LongClickable set to true without onLongClickListener"); - return false; + return false; + } } return mIsLongClickable; } @@ -762,6 +777,68 @@ public class Card extends BaseCard { } /** + * Adds a LongClickListener on a specific area + * </p> + * You can use one of these values: + * {@link Card#CLICK_LISTENER_ALL_VIEW} + * {@link Card#CLICK_LISTENER_HEADER_VIEW} + * {@link Card#CLICK_LISTENER_THUMBNAIL_VIEW} + * {@link Card#CLICK_LISTENER_CONTENT_VIEW} + * + * @param area + * @param onLongClickListener + */ + public void addPartialOnLongClickListener( + int area, OnLongCardClickListener onLongClickListener) { + + if (area < CLICK_LISTENER_ALL_VIEW && area > CLICK_LISTENER_CONTENT_VIEW) { + Log.w(TAG, "area value not valid in addPartialOnLongClickListner"); + } + + HashMap multipleOnLongClickListener = getMultipleOnLongClickListener(); + if (onLongClickListener != null) { + multipleOnLongClickListener.put(area, onLongClickListener); + mIsLongClickable = true; + } else { + removePartialOnLongClickListener(area); + } + } + + /** + * Remove LongClickListener from a specif area + * </p> + * You can use one of these values: + * {@link Card#CLICK_LISTENER_ALL_VIEW} + * {@link Card#CLICK_LISTENER_HEADER_VIEW} + * {@link Card#CLICK_LISTENER_THUMBNAIL_VIEW} + * {@link Card#CLICK_LISTENER_CONTENT_VIEW} + * + * + * @param area + */ + public void removePartialOnLongClickListener(int area) { + + HashMap multipleOnLongClickListener = getMultipleOnLongClickListener(); + multipleOnLongClickListener.remove(area); + + if (mOnLongClickListener == null && multipleOnLongClickListener.isEmpty()) { + mIsLongClickable = false; + } + } + + /** + * Map for all partial listeners + * + * @return a map with partial listeners + */ + public HashMap<Integer, OnLongCardClickListener> getMultipleOnLongClickListener() { + if (mMultipleOnLongClickListener != null) { + return mMultipleOnLongClickListener; + } + return mMultipleOnLongClickListener = new HashMap<Integer, OnLongCardClickListener>(); + } + + /** * Indicates if the card is expanded or collapsed * * @return <code>true</code> if card is ExpandLayout is visible, otherwise returns <code>false</code> diff --git a/src/com/android/cards/internal/CardArrayAdapter.java b/src/com/android/cards/internal/CardArrayAdapter.java index 19290ea..d2fab52 100644 --- a/src/com/android/cards/internal/CardArrayAdapter.java +++ b/src/com/android/cards/internal/CardArrayAdapter.java @@ -197,7 +197,8 @@ public class CardArrayAdapter extends BaseCardArrayAdapter implements UndoBarCon * @param cardView {@link CardView} */ protected void setupSwipeableAnimation(final Card card, CardView cardView) { - + HashMap<Integer, Card.OnLongCardClickListener> multipleOnLongClickListner = + card.getMultipleOnLongClickListener(); if (card.isSwipeable()){ if (mOnTouchListener == null){ mOnTouchListener = new SwipeDismissListViewTouchListener(mCardListView, mCallback); @@ -208,9 +209,25 @@ public class CardArrayAdapter extends BaseCardArrayAdapter implements UndoBarCon cardView.setOnTouchListener(mOnTouchListener); - }else{ + // We may have partial onlongclicklistener. Restore onTouchListener for this views. + setPartialOnTouchListeners(cardView, mOnTouchListener, multipleOnLongClickListner); + } else { //prevent issue with recycle view cardView.setOnTouchListener(null); + setPartialOnTouchListeners(cardView, null, multipleOnLongClickListner); + } + } + + private void setPartialOnTouchListeners(CardView cardView, + SwipeDismissListViewTouchListener onTouchListener, + HashMap<Integer, Card.OnLongCardClickListener> multipleOnLongClickListner) { + if (multipleOnLongClickListner != null && !multipleOnLongClickListner.isEmpty()) { + for (int key : multipleOnLongClickListner.keySet()) { + View viewLongClickable = cardView.decodeAreaOnClickListener(key); + if (viewLongClickable != null) { + viewLongClickable.setOnTouchListener(mOnTouchListener); + } + } } } diff --git a/src/com/android/cards/view/CardView.java b/src/com/android/cards/view/CardView.java index f6bf2ad..81ad9c1 100644 --- a/src/com/android/cards/view/CardView.java +++ b/src/com/android/cards/view/CardView.java @@ -452,43 +452,21 @@ public class CardView extends BaseCardView { @SuppressLint("NewApi") protected void setupListeners(){ - //Swipe listener - if (mCard.isSwipeable()){ - this.setOnTouchListener(new SwipeDismissViewTouchListener(this, mCard,new SwipeDismissViewTouchListener.DismissCallbacks() { - @Override - public boolean canDismiss(Card card) { - return card.isSwipeable(); - } - - @Override - public void onDismiss(CardView cardView, Card card) { - final ViewGroup vg = (ViewGroup)(cardView.getParent()); - if (vg!=null){ - vg.removeView(cardView); - card.onSwipeCard(); - } - } - })); - }else{ - this.setOnTouchListener(null); - } + // Swipe listener + addGlobalSwipeListener(this); - //OnClick listeners and partial listener + // OnClick listeners and partial listener - //Reset Partial Listeners + // Reset Partial Listeners resetPartialListeners(); + boolean hasPartialClickListener = false; + if (mCard.isClickable()){ //Set the onClickListener if(!mCard.isMultiChoiceEnabled()){ if (mCard.getOnClickListener() != null) { - this.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - if (mCard.getOnClickListener()!=null) - mCard.getOnClickListener().onClick(mCard,v); - } - }); + addGlobalClickListener(this); //Prevent multiple events //if (!mCard.isSwipeable() && mCard.getOnSwipeListener() == null) { @@ -498,7 +476,7 @@ public class CardView extends BaseCardView { }else{ HashMap<Integer,Card.OnCardClickListener> mMultipleOnClickListner=mCard.getMultipleOnClickListener(); if (mMultipleOnClickListner!=null && !mMultipleOnClickListner.isEmpty()){ - + hasPartialClickListener = true; for (int key:mMultipleOnClickListner.keySet()){ View viewClickable= decodeAreaOnClickListener(key); final Card.OnCardClickListener mListener=mMultipleOnClickListner.get(key); @@ -533,18 +511,87 @@ public class CardView extends BaseCardView { this.setClickable(false); } - //LongClick listener - if(mCard.isLongClickable()){ - this.setOnLongClickListener(new OnLongClickListener() { + // LongClick and partial listeners. + if (mCard.isLongClickable()) { + if (mCard.getOnLongClickListener() != null) { + this.setOnLongClickListener(new OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + if (mCard.getOnLongClickListener()!=null) + return mCard.getOnLongClickListener().onLongClick(mCard, v); + return false; + } + }); + } + HashMap<Integer, Card.OnLongCardClickListener> multipleOnLongClickListner = + mCard.getMultipleOnLongClickListener(); + if (multipleOnLongClickListner != null && !multipleOnLongClickListner.isEmpty()) { + + for (int key : multipleOnLongClickListner.keySet()) { + View viewLongClickable = decodeAreaOnClickListener(key); + final Card.OnLongCardClickListener listener = + multipleOnLongClickListner.get(key); + if (viewLongClickable != null) { + //Add listener to this view + viewLongClickable.setOnLongClickListener(new OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + //Callback to card listener + if (listener != null) { + return listener.onLongClick(mCard, v); + } + return false; + } + }); + // We may have only partial longclicklistener. So add for each view + // in this case the global click listener. + // As well add for this view if available the swipe listener. + addGlobalSwipeListener(viewLongClickable); + if (!hasPartialClickListener) { + addGlobalClickListener(viewLongClickable); + } + } + } + } + } else { + this.setLongClickable(false); + } + } + + private void addGlobalClickListener(View view) { + if (mCard.isClickable() && !mCard.isMultiChoiceEnabled() + && mCard.getOnClickListener() != null) { + view.setOnClickListener(new OnClickListener() { @Override - public boolean onLongClick(View v) { - if (mCard.getOnLongClickListener()!=null) - return mCard.getOnLongClickListener().onLongClick(mCard,v); - return false; + public void onClick(View v) { + if (mCard.getOnClickListener() != null) { + mCard.getOnClickListener().onClick(mCard, v); + } } }); - }else{ - this.setLongClickable(false); + } + } + + private void addGlobalSwipeListener(View view) { + if (mCard.isSwipeable()) { + view.setOnTouchListener(new SwipeDismissViewTouchListener(this, + mCard, new SwipeDismissViewTouchListener.DismissCallbacks() { + @Override + public boolean canDismiss(Card card) { + return card.isSwipeable(); + } + + @Override + public void onDismiss(CardView cardView, Card card) { + final ViewGroup vg = (ViewGroup)(cardView.getParent()); + if (vg!=null){ + vg.removeView(cardView); + card.onSwipeCard(); + } + } + })); + } else { + view.setOnTouchListener(null); } } @@ -552,17 +599,26 @@ public class CardView extends BaseCardView { * Reset all partial listeners */ protected void resetPartialListeners() { - View viewClickable= decodeAreaOnClickListener(Card.CLICK_LISTENER_HEADER_VIEW); - if (viewClickable!=null) + View viewClickable = decodeAreaOnClickListener(Card.CLICK_LISTENER_HEADER_VIEW); + if (viewClickable != null) { viewClickable.setClickable(false); - - viewClickable= decodeAreaOnClickListener(Card.CLICK_LISTENER_THUMBNAIL_VIEW); - if (viewClickable!=null) + viewClickable.setLongClickable(false); + } + viewClickable = decodeAreaOnClickListener(Card.CLICK_LISTENER_THUMBNAIL_VIEW); + if (viewClickable != null) { viewClickable.setClickable(false); - - viewClickable= decodeAreaOnClickListener(Card.CLICK_LISTENER_CONTENT_VIEW); - if (viewClickable!=null) + viewClickable.setLongClickable(false); + } + viewClickable = decodeAreaOnClickListener(Card.CLICK_LISTENER_CONTENT_VIEW); + if (viewClickable != null) { + viewClickable.setClickable(false); + viewClickable.setLongClickable(false); + } + viewClickable = decodeAreaOnClickListener(Card.CLICK_LISTENER_EXPAND_VIEW); + if (viewClickable != null) { viewClickable.setClickable(false); + viewClickable.setLongClickable(false); + } } /** @@ -570,25 +626,29 @@ public class CardView extends BaseCardView { * @param area * @return */ - protected View decodeAreaOnClickListener(int area){ + public View decodeAreaOnClickListener(int area){ - if (area<Card.CLICK_LISTENER_ALL_VIEW && area>Card.CLICK_LISTENER_CONTENT_VIEW) + if (area < Card.CLICK_LISTENER_ALL_VIEW && area > Card.CLICK_LISTENER_CONTENT_VIEW) { return null; + } View view = null; switch (area){ - case Card.CLICK_LISTENER_ALL_VIEW : - view=this; + case Card.CLICK_LISTENER_ALL_VIEW: + view = this; break; - case Card.CLICK_LISTENER_HEADER_VIEW : - view=mInternalHeaderLayout; + case Card.CLICK_LISTENER_HEADER_VIEW: + view = mInternalHeaderLayout; break; case Card.CLICK_LISTENER_THUMBNAIL_VIEW: - view=mInternalThumbnailLayout; + view = mInternalThumbnailLayout; break; case Card.CLICK_LISTENER_CONTENT_VIEW: - view=mInternalContentLayout; + view = mInternalContentLayout; + break; + case Card.CLICK_LISTENER_EXPAND_VIEW: + view = mInternalExpandLayout; break; default: break; |
