/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.ui.view; import java.util.ArrayList; import java.util.Collections; import java.util.List; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.util.AttributeSet; import android.view.ViewGroup; import android.widget.ProgressBar; import android.widget.TextView; import com.galaxy.meetup.client.android.R; /** * * @author sihai * */ public class CirclesButton extends ViewGroup { private final TextView mCircleCountText; private final Drawable mCircleIcon; private final int mCircleIconSpacing; private List mCircleNames; private final TextView mCirclesText; private int mDefaultTextColor; private String mFixedText; private final int mLabelSpacing; private Rect mPadding; private ProgressBar mProgressBar; private final StringBuilder mSb; private boolean mShowIcon; private boolean mShowProgressIndicator; public CirclesButton(Context context) { this(context, null); } public CirclesButton(Context context, AttributeSet attributeset) { this(context, attributeset, R.style.CirclesButton); } public CirclesButton(Context context, AttributeSet attributeset, int i) { super(context, attributeset, i); mSb = new StringBuilder(); mShowIcon = true; mDefaultTextColor = 0; TypedArray typedarray = context.obtainStyledAttributes(attributeset, R.styleable.CircleButton, 0, i); mCircleIconSpacing = typedarray.getDimensionPixelSize(5, 0); mLabelSpacing = typedarray.getDimensionPixelSize(6, 0); mDefaultTextColor = typedarray.getColor(0, 0); mFixedText = typedarray.getString(3); mCircleIcon = typedarray.getDrawable(4); typedarray.recycle(); mCircleIcon.setFilterBitmap(true); mCirclesText = new TextView(context); mCirclesText.setLayoutParams(new android.view.ViewGroup.LayoutParams(-2, -1)); mCirclesText.setTextAppearance(context, 0x1030046); mCirclesText.setTypeface(mCirclesText.getTypeface(), 1); mCirclesText.setSingleLine(); mCirclesText.setEllipsize(android.text.TextUtils.TruncateAt.END); mCirclesText.setGravity(16); if(mDefaultTextColor != 0) mCirclesText.setTextColor(mDefaultTextColor); addView(mCirclesText); mCircleCountText = new TextView(context); mCircleCountText.setLayoutParams(new android.view.ViewGroup.LayoutParams(-2, -1)); mCircleCountText.setTextAppearance(context, 0x1030046); mCircleCountText.setGravity(16); mCircleCountText.setSingleLine(); mCircleCountText.setEllipsize(android.text.TextUtils.TruncateAt.END); addView(mCircleCountText); } private void appendCirclesText(StringBuilder stringbuilder, int i) { List arraylist; int j1; if(i == mCircleNames.size()) { arraylist = mCircleNames; } else { arraylist = new ArrayList(mCircleNames); while(arraylist.size() > i) { int j = 0; int k = -1; for(int l = 0; l < arraylist.size(); l++) { int i1 = ((String)arraylist.get(l)).length(); if(i1 >= j) { j = i1; k = l; } } arraylist.remove(k); } } for(j1 = 0; j1 < i; j1++) { if(j1 > 0) stringbuilder.append(", "); stringbuilder.append((String)arraylist.get(j1)); } if(i < mCircleNames.size()) stringbuilder.append(",��"); } protected void dispatchDraw(Canvas canvas) { if(mShowIcon) mCircleIcon.draw(canvas); super.dispatchDraw(canvas); } protected void onLayout(boolean flag, int i, int j, int k, int l) { boolean flag1 = mShowIcon; int i1 = 0; if(flag1) i1 = 0 + (mCircleIcon.getIntrinsicWidth() + mCircleIconSpacing); if(mCircleCountText.getVisibility() == 0) i1 += mCircleCountText.getMeasuredWidth() + mLabelSpacing; int j1 = i1 + mCirclesText.getMeasuredWidth(); int k1 = (k - i - j1) / 2; if(k1 < mPadding.left) k1 = mPadding.left; int l1 = k1 + j1; if(l1 > k - i - mPadding.right) l1 = k - i - mPadding.right; if(mShowIcon) { int i3 = mCircleIcon.getIntrinsicHeight(); int j3 = mCircleIcon.getIntrinsicWidth(); int k3 = (l - j - i3) / 2; mCircleIcon.setBounds(k1, k3, k1 + j3, k3 + i3); k1 += j3 + mCircleIconSpacing; } if(mCircleCountText.getVisibility() == 0) if(mCirclesText.getVisibility() == 0) { int k2 = mCircleCountText.getMeasuredWidth(); int l2 = l1 - k2; mCircleCountText.layout(l2, mPadding.top, l2 + k2, l - j - mPadding.bottom); l1 = l2 - mLabelSpacing; } else { mCircleCountText.layout(k1, mPadding.top, l1, l - j - mPadding.bottom); } if(mCirclesText.getVisibility() == 0) mCirclesText.layout(k1, mPadding.top, l1, l - j - mPadding.bottom); if(mShowProgressIndicator) { int i2 = mProgressBar.getMeasuredWidth(); int j2 = (k - i - i2) / 2; mProgressBar.layout(j2, mPadding.top, j2 + i2, i2 + mPadding.top); } } protected void onMeasure(int i, int j) { if(mPadding == null) { mPadding = new Rect(); Drawable drawable = getBackground(); if(drawable != null) drawable.getPadding(mPadding); int l6 = getPaddingLeft(); if(l6 != 0) mPadding.left = l6; int i7 = getPaddingRight(); if(i7 != 0) mPadding.right = i7; } int k = android.view.View.MeasureSpec.getSize(i); int l = android.view.View.MeasureSpec.makeMeasureSpec(android.view.View.MeasureSpec.getSize(j), 0x80000000); int i1 = mPadding.left + mPadding.right; boolean flag = mShowIcon; int j1 = 0; if(flag) { int k6 = mCircleIcon.getIntrinsicWidth(); j1 = mCircleIcon.getIntrinsicHeight(); i1 += k6 + mCircleIconSpacing; } int k1; int l2; int i3; int j3; int k3; int l3; int i4; int j4; int k4; int l4; if(k == 0) k1 = 0x7fffffff; else k1 = k - i1; mCirclesText.setVisibility(0); if(mFixedText != null) { mCirclesText.setText(mFixedText); mCirclesText.measure(android.view.View.MeasureSpec.makeMeasureSpec(k1, 0x80000000), l); l2 = mCirclesText.getMeasuredWidth(); mCircleCountText.setVisibility(8); } else { mSb.setLength(0); int l1 = mCircleNames.size(); appendCirclesText(mSb, l1); mCirclesText.setText(mSb); mCirclesText.measure(0, l); int i2 = mCirclesText.getMeasuredWidth(); if(i2 <= k1) { l2 = i2; mCircleCountText.setVisibility(8); } else if(l1 == 1) { int j6 = k1; mCirclesText.measure(android.view.View.MeasureSpec.makeMeasureSpec(j6, 0x80000000), l); l2 = mCirclesText.getMeasuredWidth(); mCircleCountText.setVisibility(8); } else { mCircleCountText.setVisibility(0); Resources resources = getContext().getResources(); int j2 = 0; int k2 = l1 - 1; do { if(k2 <= 0) break; mSb.setLength(0); appendCirclesText(mSb, k2); mCirclesText.setText(mSb); mCirclesText.measure(0, l); i2 = mCirclesText.getMeasuredWidth(); int l5 = l1 - k2; TextView textview1 = mCircleCountText; int i6 = R.plurals.circle_button_more_circles; Object aobj1[] = new Object[1]; aobj1[0] = Integer.valueOf(l5); textview1.setText(resources.getQuantityString(i6, l5, aobj1)); mCircleCountText.measure(0, l); j2 = mCircleCountText.getMeasuredWidth(); if(j2 + (i2 + mLabelSpacing) <= k1) break; k2--; } while(true); if(j2 + (i2 + mLabelSpacing) > k1) { mCirclesText.setVisibility(8); i2 = 0; TextView textview = mCircleCountText; Context context = getContext(); int k5 = R.string.circle_button_circles; Object aobj[] = new Object[1]; aobj[0] = Integer.valueOf(l1); textview.setText(context.getString(k5, aobj)); mCircleCountText.measure(android.view.View.MeasureSpec.makeMeasureSpec(k1, 0x80000000), l); j2 = mCircleCountText.getMeasuredWidth(); } l2 = j2 + (i2 + mLabelSpacing); } } i3 = l2 + i1; j3 = Math.max(j1, mCirclesText.getMeasuredHeight()) + mPadding.top + mPadding.bottom; k3 = resolveSize(i3, i); l3 = resolveSize(j3, j); i4 = mPadding.left; if(mShowIcon) i4 += mCircleIcon.getIntrinsicWidth() + mCircleIconSpacing; j4 = k3 - mPadding.right; if(mCircleCountText.getVisibility() == 0) { int j5 = mCircleCountText.getMeasuredWidth(); mCircleCountText.measure(android.view.View.MeasureSpec.makeMeasureSpec(j5, 0x40000000), android.view.View.MeasureSpec.makeMeasureSpec(l3 - mPadding.top - mPadding.bottom, 0x40000000)); j4 -= j5 + mLabelSpacing; } k4 = mCirclesText.getMeasuredWidth(); l4 = j4 - i4; if(k4 > l4) k4 = j4 - i4; mCirclesText.measure(android.view.View.MeasureSpec.makeMeasureSpec(k4, 0x40000000), android.view.View.MeasureSpec.makeMeasureSpec(l3 - mPadding.top - mPadding.bottom, 0x40000000)); if(mShowProgressIndicator) { int i5 = android.view.View.MeasureSpec.makeMeasureSpec(l3 - mPadding.top - mPadding.bottom, 0x40000000); mProgressBar.measure(i5, i5); } setMeasuredDimension(k3, l3); } public void setCircles(List arraylist) { mFixedText = null; mCircleNames = arraylist; Collections.sort(mCircleNames, String.CASE_INSENSITIVE_ORDER); requestLayout(); } public void setHighlighted(boolean flag) { if (flag) { setBackgroundResource(R.drawable.plusone_by_me_button); mCirclesText.setTextColor(-1); } else { setBackgroundResource(R.drawable.plusone_button); mCirclesText.setTextColor(0xff000000); } } public void setShowIcon(boolean flag) { if(mShowIcon != flag) { mShowIcon = flag; requestLayout(); } } public void setShowProgressIndicator(boolean flag) { if(mShowProgressIndicator == flag) { return; } mShowProgressIndicator = flag; if(!flag) { if(mProgressBar != null) { mProgressBar.setVisibility(8); mCirclesText.setVisibility(0); } } else { if(mProgressBar == null) { mProgressBar = new ProgressBar(getContext()); mProgressBar.setIndeterminate(true); addView(mProgressBar); } mProgressBar.setVisibility(0); mCirclesText.setVisibility(8); mShowIcon = false; setHighlighted(false); } requestLayout(); } public void setText(String s) { if(!TextUtils.equals(mFixedText, s)) { mFixedText = s; requestLayout(); } } }