package com.quickactionbar;
import java.lang.ref.WeakReference;
import java.util.List;
import android.content.Context;
import android.graphics.Rect;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.MeasureSpec;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
import android.widget.HorizontalScrollView;
import android.widget.TextView;
/**
* A QuickActionBar displays a set of {@link QuickAction} on a single row. In
* case too many items are added to the QuickActionBar, the user can
* horizontally scroll {@link QuickAction}s. Using a QuickActionBar is a great
* replacement for the long click UI pattern. For instance, {@link QuickActionBar} adds secondary actions to an item of a ListView.
*
* @author Benjamin Fellous
* @author Cyril Mottier
*/
public class QuickActionBar extends QuickActionWidget {
private HorizontalScrollView mScrollView;
private Animation mRackAnimation;
private ViewGroup mRack;
private ViewGroup mQuickActionItems;
private List<QuickAction> mQuickActions;
public QuickActionBar(Context context) {
super(context);
mRackAnimation = AnimationUtils.loadAnimation(context, R.anim.gd_rack);
mRackAnimation.setInterpolator(new Interpolator() {
public float getInterpolation(float t) {
final float inner = (t * 1.55f) - 1.1f;
return 1.2f - inner * inner;
}
});
setContentView(R.layout.gd_quick_action_bar);
final View v = getContentView();
mRack = (ViewGroup) v.findViewById(R.id.gdi_rack);
mQuickActionItems = (ViewGroup) v.findViewById(R.id.gdi_quick_action_items);
mScrollView = (HorizontalScrollView) v.findViewById(R.id.gdi_scroll);
}
@Override
public void show(View anchor) {
super.show(anchor);
mScrollView.scrollTo(0, 0);
mRack.startAnimation(mRackAnimation);
}
@Override
protected void onMeasureAndLayout(Rect anchorRect, View contentView) {
contentView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
contentView.measure(MeasureSpec.makeMeasureSpec(getScreenWidth(), MeasureSpec.EXACTLY), LayoutParams.WRAP_CONTENT);
int rootHeight = contentView.getMeasuredHeight();
int offsetY = getArrowOffsetY();
int dyTop = anchorRect.top;
int dyBottom = getScreenHeight() - anchorRect.bottom;
boolean onTop = (dyTop > dyBottom);
int popupY = (onTop) ? anchorRect.top - rootHeight + offsetY : anchorRect.bottom - offsetY;
int popupX = anchorRect.right + getWidth();
setWidgetSpecs(popupY, popupX, onTop);
}
@Override
protected void populateQuickActions(List<QuickAction> quickActions) {
mQuickActions = quickActions;
final LayoutInflater inflater = LayoutInflater.from(getContext());
for (QuickAction action : quickActions) {
TextView view = (TextView) inflater.inflate(R.layout.gd_quick_action_bar_item, mQuickActionItems, false);
view.setText(action.mTitle);
view.setCompoundDrawablesWithIntrinsicBounds(null, action.mDrawable, null, null);
view.setOnClickListener(mClickHandlerInternal);
mQuickActionItems.addView(view);
action.mView = new WeakReference<View>(view);
}
}
@Override
protected void onClearQuickActions() {
super.onClearQuickActions();
mQuickActionItems.removeAllViews();
}
private OnClickListener mClickHandlerInternal = new OnClickListener() {
public void onClick(View view) {
final OnQuickActionClickListener listener = getOnQuickActionClickListener();
if (listener != null) {
final int itemCount = mQuickActions.size();
for (int i = 0; i < itemCount; i++) {
if (view == mQuickActions.get(i).mView.get()) {
listener.onQuickActionClicked(QuickActionBar.this, i);
break;
}
}
}
if (getDismissOnClick()) {
dismiss();
}
}
};
}